假设我有一个只有两列的表: name 和 mood 。一行包含人名和他们的心情,如果他们有多种情绪,那么多行存储在数据库中。
例如,在数据库中是约翰,他很高兴,很兴奋,也很自豪。
这表示为
John Happy
John Excited
John Proud
我想要做的是根据满足的几种情绪选择名称。与UNION类似:
SELECT name WHERE mood=Happy
UNION
SELECT name WHERE mood=Excited
UNION
SELECT name WHERE mood=Proud
但是使用上述联合会导致:
John
John
John
Union all会产生John的单个结果,但它也会选择任何只匹配其中一个查询的名称。
我可以想到一些算法可以获取每个单独的mysql_result资源(我使用的是PHP),并寻找匹配的结果,但我想知道的是MySQL是否已经为此提供了便利。
我意识到以上是一个相当模糊的概括,不用说我的实际程序有点复杂,我对这个问题有点愚蠢,请不要犹豫提问。
答案 0 :(得分:3)
如果您没有重复项,则可以使用子查询执行此操作:
SELECT `name` FROM (
SELECT `name`, COUNT(*) AS `count` FROM `moods`
WHERE `mood` IN ('Excited', 'Happy', 'Proud') GROUP BY `name`
) WHERE `count` = 3
或者,您可以使用join:
SELECT `m1`.`name` FROM `moods` `m1`
JOIN `moods` `m2` USING (`name`)
JOIN `moods` `m3` USING (`name`)
WHERE `m1`.`mood` = 'Excited' AND `m2`.`mood` = 'Happy' AND `m3`.`mood` = 'Proud'
不太可爱,但如果你使用LIMIT可能会更快。或者可能不是。取决于查询规划器。
UPD :感谢Tudor Constantin提醒我有关HAVING的信息,第一个查询可以是:
SELECT `name` FROM `moods`
WHERE `mood` IN ('Excited', 'Happy', 'Proud')
GROUP BY `name`
HAVING COUNT(*)>3
答案 1 :(得分:1)
如果我正确理解了您的问题,我认为在这种情况下,您实际上并不需要UNION
,而只需要WHERE
语句中的多个条件。
试试这个:
SELECT name, mood FROM myTable WHERE mood in ('Happy','Excited','Proud')
应该给出结果:
John, Happy
John, Excited
John, Proud
如果您不关心获得多种心情结果,请尝试以下方法:
SELECT DISTINCT name FROM myTable WHERE mood in ('Happy','Excited','Proud')
这将给出:
应该给出结果:
John
<强>更新强> 如果要匹配所有条件,则可能必须使用子选择:
SELECT DISTINCT name FROM myTable
WHERE name IN
(SELECT name FROM myTable WHERE mood = 'Happy')
AND name IN
(SELECT name FROM myTable WHERE mood = 'Excited')
AND name IN
(SELECT name FROM myTable WHERE mood = 'Proud')
答案 2 :(得分:1)
尝试:
SELECT name FROM user_moods um1
INNER JOIN user_moods um2 ON um1.name = um2.name
WHERE um1.mood IN ('Happy','Excited','Proud')
GROUP BY um2.mood
HAVING COUNT(um2.mood) = 3 # the number of different moods
答案 3 :(得分:1)
您的查询已经正确无误。您可以使用ADD
子句中的搜索词WHERE
添加一列。
SELECT name,'Happy' as imood WHERE mood='Happy'
UNION
SELECT name,'Excited' as imood WHERE mood='Excited'
UNION
SELECT name,'Proud' as imood WHERE mood='Proud'
答案 4 :(得分:0)
用INTERSECT替换UNION。