【问题标题】:Sql select where array in columnSql选择列中的数组
【发布时间】:2019-07-24 18:11:56
【问题描述】:

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

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

我想要满足以下两个需求的查询。我有一个允许的变量(php)attribute_id's。如果数组是 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 所做的事情的反面。

【问题讨论】:

  • 可以多行有相同的attribute_id吗?如果是这样,您如何决定返回哪个category_id
  • @Nick 实际上是的。但我有非常复杂的查询。我不会直接使用select。我只需要where 部分。整个查询在category_id 上有join。所以根据我的估计,加入后的结果会像提供的虚拟表一样。我需要过滤该表。我尝试了右连接,不同的位置,子查询。我不知道如何执行我的任务。
  • 知道这个问题以前没有人问过,真是令人惊讶。
  • @Anees 对我来说,更令人惊讶的是,我被否决了两次。不知道为什么。不过同意。我开始认为我做事的方式不对。然而,没有人提出任何简单的解决方案。
  • 这可能是因为这个问题乍一看很傻。但实际上是有效的,甚至是有趣的(你得到了我的 +1)。应该有一个更简单的解决方案。

标签: mysql sql select where where-in


【解决方案1】:

解决方案

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

第2步:将所需值列表与上一步获得的记录左连接。

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

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


示例

表“数据”:

必填值:
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;

【讨论】:

    【解决方案2】:

    您可以使用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
    

    【讨论】:

    • 我没试过,也不是SQL专家。但这看起来行不通,因为count(*) 将计算分组在一起的记录,如果 attribute_id 是唯一的,则等于 1,而不是有多少唯一的 attribute_id。
    • @Anees 。 . . COUNT(*) 计算匹配类别的数量。这似乎正是 OP 想要的。您对 SQL 和 GROUP BY 有误解。
    【解决方案3】:

    您可以将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);
    

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

    【讨论】:

    • 这不适合第一种情况。您的select * from category_attributes where category_attributes.attribute_id in (1,2,3, 4); 将给出所有结果。我不想要这个。
    • 我知道如何使用in。我已经编写了我需要的发明语法。
    • 更改了答案。希望这可能会有所帮助。
    • 您是否尝试过您的查询?我收到一个错误Operand should contain 1 column
    • 我设法运行了您的查询(稍作改动)。但是第一种情况没有实现。查询(1, 2, 3, 4) 的参数应该没有结果
    猜你喜欢
    • 1970-01-01
    • 2022-06-16
    • 2015-01-09
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2022-11-20
    • 2023-03-02
    • 2016-06-07
    相关资源
    最近更新 更多