【发布时间】:2011-06-29 02:38:25
【问题描述】:
我有一个带有列的 mySQL 表:名称和标签。如果一个人“Bob”有标签“cool”、“funny”和“childish”,我的表将有相应的行:(Bob,cool)、(Bob,funny)和(Bob,childish)。
有没有一种基于布尔查询标签选择人员的有效方法?例如,在伪 SQL 中:SELECT name WHERE person IS (COOL OR NOT FUNNY) AND NOT CHILDISH。
我想我可以使用 UNION、JOIN 或者一些子查询来组合一些东西,但我想知道是否有一种有效的方法来做到这一点。
编辑:
截至目前,我计划分发 AND,即((酷或不有趣)而不是幼稚)=>(酷而不是幼稚)或(不有趣而不是幼稚)。然后我可以确定每个部分与以下内容进行或运算:
SELECT DISTINCT a.name
FROM `tags` AS a
JOIN `tags` AS b ON (a.label='cool' AND a.name=b.name AND b.name NOT IN (
SELECT name FROM `tags` WHERE label='funny'))
JOIN `tags` AS c ON (a.name=c.name AND c.name='childish')
# for "COOL AND NOT FUNNY AND CHILDISH"
然后使用 UNION 将它们连接在一起。
【问题讨论】:
-
我认为这已经是最有效的了。我不知道任何其他方法可以提高效率,也想不出任何方法。
标签: mysql logic boolean union intersection