1

抱歉,我在任何地方都找不到示例,主要是因为我想不出任何不包括 DISTINCT 或 UNIQUE 的其他方式来解释它(我发现它们在 SQL 中具有误导性)。

我需要从一个表中选择唯一值和空值。

FLAVOURS:
id  |  name  |  flavour
--------------------------
1   |  mark  |  chocolate
2   |  cindy |  chocolate
3   |  rick  |  
4   |  dave  |  
5   |  jenn  |  vanilla
6   |  sammy |  strawberry
7   |  cindy |  chocolate
8   |  rick  |  
9   |  dave  |  
10  |  jenn  |  caramel
11  |  sammy |  strawberry

我想要有独特风味(香草、焦糖)的孩子和没有任何风味的孩子。

我不希望孩子有重复的口味(巧克力、草莓)。

我的帮助搜索总是返回有关如何对巧克力和草莓进行 GROUP BY、UNIQUE 和 DISTINCT 的答案。那不是我想要的。我不希望某个领域中有任何重复的术语——我想要其他所有内容。

什么是正确的 MySQL 选择语句?

谢谢!

4

3 回答 3

1

您可以使用 HAVING 仅选择一些组,因此要选择只有一种风味的组,请使用:

SELECT * from my_table GROUP BY flavour HAVING COUNT(*) = 1

如果你想选择那些有 NULL 条目的用户,你可以使用

SELECT * FROM my_table WHERE flavour IS NULL

如果将它们结合起来,您将获得所有具有独特风味或 NULL 的条目。

SELECT * from my_table GROUP BY flavour HAVING COUNT(*) = 1 AND flavour IS NOT NULL
UNION
SELECT * FROM my_table WHERE flavour IS NULL

我添加了“flavour IS NOT NULL”只是为了确保如果它是单个风味,则不会选择为 NULL 的风味,这会产生重复。

于 2013-02-20T18:36:48.117 回答
0

您需要一个查找重复项的自联接,然后您需要通过查找不匹配的情况(即 WHERE t2.flavor IS NULL)来否决这些重复项。然后你正在做一些完全不同的事情,在原始表中寻找空值,第二行在 WHERE 子句中(OR t1.flavor IS NULL)

SELECT DISTINCT t1.name, t1.flavor 
FROM tablename t1
LEFT JOIN tablename t2
ON t2.flavor = t1.flavor AND t2.ID <> t1.ID
WHERE t2.flavor IS NULL
OR t1.flavor IS NULL

我希望这有帮助。

于 2013-02-20T18:38:03.583 回答
0

我手头没有数据库,但您应该能够使用类似的查询。

SELECT name from FLAVORS WHERE flavor IN (SELECT flavor, count(Flavour) from FLAVORS where count(Flavour) = 1 GROUP BY flavor) OR flavor IS NULL;

如果这不是很正确,我深表歉意,但希望是一个好的开始。

于 2013-02-20T18:24:39.720 回答