如何使用union语句选择mysql数据,其中数据与每个select语句匹配,即将AND运算符与UNION组合?

时间:2012-01-21 10:38:05

标签: php mysql select union advanced-search

假设我有一个只有两列的表: 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是否已经为此提供了便利。

我意识到以上是一个相当模糊的概括,不用说我的实际程序有点复杂,我对这个问题有点愚蠢,请不要犹豫提问。

5 个答案:

答案 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。