Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择属性满足条件或未设置的所有行_Mysql - Fatal编程技术网

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关键

我有以下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关键字从列中选择不同的值

您的查询应该是

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')