Mysql 选择属性满足条件或未设置的所有行
我有以下MySQL表:Mysql 选择属性满足条件或未设置的所有行,mysql,Mysql,我有以下MySQL表: id num attr ------------ 1 A x 2 A y 3 B x 4 C y 此查询从表中选择*,其中attr=y返回attr设置为y的所有内容,并排除结果中的所有其他内容: 2 A y 4 C y 我需要一个表中所有唯一num值的列表,包括那些有attr=y和没有attr=y的值,以及attr值。例如: 2 A y 3 B 4 C y 是否可能以及如何实现?您只需要使用DISTINCT关键
id num attr
------------
1 A x
2 A y
3 B x
4 C y
此查询从表中选择*,其中attr=y返回attr设置为y的所有内容,并排除结果中的所有其他内容:
2 A y
4 C y
我需要一个表中所有唯一num值的列表,包括那些有attr=y和没有attr=y的值,以及attr值。例如:
2 A y
3 B
4 C y
是否可能以及如何实现?您只需要使用DISTINCT关键字从列中选择不同的值
您的查询应该是
SELECT DISTINCT num,id,attr
FROM table
WHERE where_conditions
ORDER BY id;
试试这个:
SELECT id, num, IF(FIND_IN_SET('y', GROUP_CONCAT(DISTINCT attr))>0, 'y', '') as attr
FROM table
GROUP BY num
但若attr列不是消耗资源的整数、字符或小的varchar,那个么这将非常有效。
过度使用它可能不会消耗资源,并且可能值得放入子查询
我会解释这个
第一个事实上是最后一个:最重要的是,查询有GROUPBY。
拥有GROUP BY允许使用GROUP_CONCAT。此函数使用DISTINCT创建列的不同值的逗号分隔列表。因此,在您的案例中,组_CONCATDISTINCT attr将返回如下内容:
id num attr
------------
1 A x,y
3 B x
4 C y
在\集中查找\在逗号分隔的列表中搜索给定值。它返回在列表中搜索的元素的位置。
因此,在这种情况下:
id num attr FIND_IN_SET('y',GROUP_CONCAT.....)
----------------------
1 A x,y 2
3 B x 0
4 C y 1
最后一句话:IF-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')
在“num”列上选择Distinct?听起来很合理,但结果中A和B的属性为空。只有“C”的“attr”显示为“y”。谢谢,@cyadder。新的查询非常有效!解决了我目前的问题。虽然对我的理解非常复杂:我试图用子查询解决问题,但最初没有成功。有没有可能在本练习中帮助进行子查询?多么好的解释啊!感谢您的输入@cyadder。subqueries版本也起作用,但使用或代替,在我的例子中是这样的:SELECT*FROM table1,其中id在SELECT id FROM table1,其中attr='y'或num NOT在SELECT DISTINCT num FROM table1,其中attr='y'前面的逗号无效。但无论如何,它返回与原始查询相同的结果,缺少“B”。
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')