我有以下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
是否可能以及如何?
答案 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')