选择具有属性满足条件或未设置的所有行

时间:2015-03-09 15:27:40

标签: mysql

我有以下MySQL表:

id num attr
------------
1  A   x
2  A   y
3  B   x
4  C   y

此查询SELECT * FROM table WHERE attr = y会返回attr设置为y的所有内容,并排除结果中的所有其他内容:

2  A   y
4  C   y

我需要表中所有唯一num值的列表(包括那些具有attr = y和没有它的值)和attr值。例如:

2  A   y
3  B   
4  C   y

是否可能以及如何?

2 个答案:

答案 0 :(得分:0)

您只需使用DISTINCT关键字从列中选择不同的值。

您的查询应该像

SELECT DISTINCT num,id,attr
FROM table
WHERE where_conditions
ORDER BY id;

答案 1 :(得分:0)

SELECT id, num, IF(attr='y',attr,'') as attr
FROM table
GROUP BY num

试试这个:

SELECT id, num, IF(FIND_IN_SET('y', GROUP_CONCAT(DISTINCT attr))>0, 'y', '') as attr
FROM table
GROUP BY num

但是如果attr列不占用资源(整数,字符或小变量),这将很有效。 过度使用可能不会消耗资源,并且可能值得将子查询放入


我将解释这个。

首先(实际上是最后:))和主要的事情 - 查询有GROUP BY。 让GROUP BY允许使用GROUP_CONCAT()。带DISTINCT的此函数创建以逗号分隔的列的不同值列表。因此,在您的情况下,GROUP_CONCAT(DISTINCT attr)将返回如下内容:

id num attr
------------
1  A   x,y
3  B   x
4  C   y

FIND_IN_SET()在逗号分隔列表中搜索给定值。它返回列表中搜索元素的位置。 所以在这种情况下它将是:

id num attr FIND_IN_SET('y',GROUP_CONCAT.....)
----------------------
1  A   x,y 2
3  B   x   0
4  C   y   1

最后一条声明:IF() - 如果FIND_IN_SET()返回任何大于0的值 - 表示存在'y'的记录

希望这会清除查询。


一个子查询看起来更耗资......

SELECT * FROM table
WHERE id IN (SELECT id FROM table WHERE attr='y')
AND num NOT IN (SELECT DISTINCT num FROM table WHERE attr='y')