【问题标题】:MySQL data must exist in two columns to be returnedMySQL 数据必须存在于两列中才能返回
【发布时间】:2013-09-24 14:41:58
【问题描述】:

我被困在实现这个 MySQL 查询的最佳方法上。

我有三张桌子:

产品 - 这是产品列表

id | product_name

- 这是一个类别列表

id | category_name

cats_selected - 可以将多个类别分配给一个产品,此表列出了它们

cat_id | product_id

在搜索中,用户可以一次选择多个类别进行搜索。我想检查每个类别中是否存在产品,因此它需要匹配 cat_id 和 product_id。猫 ID 以数组形式发布。

查询这些数据的最佳方法是什么?

例如,由于显而易见的原因,以下内容不起作用:

SELECT *
FROM products
JOIN cats_selected
ON cats_selected.product_id = products.id
AND cats_selected.cat_id = '16372' 
AND cats_selected.cat_id = '9'

【问题讨论】:

    标签: php mysql


    【解决方案1】:
    SELECT p.id
    FROM products p
    JOIN cats_selected s ON s.product_id = p.id
    where s.cat_id in (16372, 9)
    group by p.id
    having count(distinct s.cat_id) = 2
    

    【讨论】:

    • >=2 可能更好?
    • @allen213:因为where 子句存在完全 2 个不同的cat_ids,所以没有必要。
    • 不确定我是否同意,因为他在问题正文中说的是多个而不是 2,尽管示例数据当然有 2 个项目。我正在阅读至少两个。
    • 这当然要根据in 子句中的元素数量进行调整。但对于那个例子,它总是=2
    • 是的,这就是我要找的,谢谢 juergen。我需要 HAVING 子句来限制返回的结果。我的示例只显示了两个类别,但我会根据搜索的类别数量进行调整。也感谢其他所有人的帮助。
    【解决方案2】:

    这行得通吗?您的查询语法不正确。

    SELECT *
    FROM products
    JOIN cats_selected
    ON cats_selected.product_id = products.id
    WHERE cats_selected.cat_id IN ('16372', '9')
    

    【讨论】:

      【解决方案3】:

      假设你的 cat_id 的数组看起来像 [1,2,4,3,52] 你可以使用 IN 函数,你需要在 WHERE 部分检查cats_selected.cat_id

      $cat_ids = [1,2,4,3,52];
      $catImplode = implode(",",$cat_ids);
      
      $query = <<<END
         SELECT products.*, GROUP_CONCAT(cats_selected.cat_id) as cats
         FROM products
         JOIN cats_selected
         ON cats_selected.product_id = products.id
         WHERE cats_selected.cat_id IN ($catImplode)
         GROUP BY products.id
      END;
      

      这将导致 $query 成为:

      SELECT products.*, GROUP_CONCAT(cats_selected.cat_id) as cats
      FROM products
      JOIN cats_selected
      ON cats_selected.product_id = products.id
      WHERE cats_selected.cat_id IN (1,2,4,3,52)
      GROUP BY products.id
      

      添加了别名为 cats 的 GROUP_CONCAT 列,以防您需要知道与产品匹配的类别

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多