0

假设我有一个只有两列的表:namemood。一行包含一个人的姓名和他们的心情,如果他们有多种心情,则多行存储在数据库中。

例如,数据库中有 John,他很高兴、很兴奋、很自豪。

这表示为

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 是否已经促进了这一点。

我意识到上面是一个相当模糊的概括,不用说我的实际程序要复杂得多,我已经为这个问题把它简化了一点,请不要犹豫,提出问题。

4

5 回答 5

2

如果您没有重复项,则可以使用子查询来完成:

SELECT `name` FROM (
    SELECT `name`, COUNT(*) AS `count` FROM `moods`
    WHERE `mood` IN ('Excited', 'Happy', 'Proud') GROUP BY `name`
) WHERE `count` = 3

或者,您可以使用连接:

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
于 2012-01-21T10:53:07.570 回答
0

尝试:

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
于 2012-01-21T10:53:43.633 回答
0

您的查询已经正确。您可以使用您在子句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'
于 2012-01-21T11:07:54.443 回答
0

如果我正确理解您的问题,我认为在这种情况下,您实际上并不需要一个语句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')
于 2012-01-21T10:45:22.193 回答
0

将 UNION 替换为 INTERSECT 。

于 2012-01-21T10:45:28.187 回答