SQL选择列

时间:2019-03-03 06:29:35

标签: mysql sql select where where-in

在查询中,我使用联接表category_attributes。假设我们有这样的行:

category_id|attribute_id
1|1
1|2
1|3

我想查询满足以下两个需求的查询。我有一个允许的attribute_id's变量(php)。如果数组是attribute_id的子集,则应选择category_id,否则请选择-没有结果。

第一种情况:

select * from category_attributes where (1,2,3,4) in category_attributes.attribute_id

不应给出任何结果。

第二种情况

select * from category_attributes where (1,2,3) in category_attributes.attribute_id

应给出全部三行(请参见开头的虚拟行)。

因此,我想了解标准SQL in的功能。

3 个答案:

答案 0 :(得分:0)

解决方案

步骤1:按要检查的字段对数据进行分组。

步骤2:将所需值列表与上一步中获得的记录一起左移。

步骤3:现在,我们有了一个列表,其中包含必需值和表中的对应值。如果表中存在第二列,则第二列将等于所需值;否则,NULL会等于第二列。

Step 3 output

计数右列中的空值。如果等于0,则表示表包含所有必需的值。在这种情况下,请返回表中的所有记录。否则,表中至少必须缺少一个必需值。因此,不返回任何记录。


样本

表“数据”:

Table data

必需值:
10, 20, 50

查询:

SELECT * 
FROM   Data 
WHERE  (SELECT Count(*) 
        FROM   (SELECT D.value 
                FROM   (SELECT 10 AS value 
                        UNION 
                        SELECT 20 AS value 
                        UNION 
                        SELECT 50 AS value) T 
                       LEFT JOIN (SELECT value 
                                  FROM   Data 
                                  GROUP  BY value) D 
                              ON ( T.value = D.value )) J 
        WHERE  value IS NULL) = 0;

答案 1 :(得分:0)

您可以使用group byhaving

select ca.category_id
from category_attributes ca
where ca.attribute_id in (1, 2, 3, 4) 
group by ca.category_id
having count(*) = 4;  -- "4" is the size of the list

这假定该表没有重复项(这是属性映射表的典型值)。如果有可能,请使用:

having count(distinct ca.attribute_id) = 4

答案 2 :(得分:-1)

您可以将attribute_id聚合到数组中,并比较php中的两个数组。

SELECT category_id FROM 
(select category_id, group_concat(attribute_id) as attributes from category_attributes
order by attribute_id) t WHERE t.attributes = (1, 2, 3);

但是您需要找到另一种比较数组的方法,或者确保始终对数组进行排序。