【问题标题】:MySQL: Multiple conditionsMySQL:多个条件
【发布时间】:2016-11-30 21:24:21
【问题描述】:

使用 MySQL

我不想实现的是只返回产品(WHERE pf.filter = 10 AND pf.filter = 15 AND pf.filter = 18)并且没有其他产品。

我认为下面的查询会起作用,但它没有给我任何结果。 当我删除 WHERE 和条件时,有 3 行 pf.filter_id 为 10,15,18

SELECT * FROM products p
LEFT JOIN filter pf ON (p.product_id = pf.product_id)
WHERE pf.filter = 10
AND pf.filter = 15
AND pf.filter = 18
GROUP BY p.product_id

应该如何构造这个 SQL 查询才能工作?

【问题讨论】:

  • 你这样做似乎没问题,多个AND通常效果很好,你确定这不是逻辑问题吗?我可以看到你问等于 15 的过滤器和等于 18 的过滤器,它应该是 OR
  • 这是逻辑问题,一个字段一次不能超过一个值。
  • filter 怎么可能是 10 AND 15 AND 18?
  • 不知道你所说的逻辑问题是什么意思?
  • 因此,如果您说产品必须具有所有 3 个过滤条件,那么 having is count=3 是一种方法。如果它可以是 3 个中的任何一个,那么 orin 将起作用。我有一辆车。它不能是汽车、货车和卡车。它可以是汽车、货车或卡车。 ...或者我可以拥有一辆有 4 门、自动和天窗的汽车......它必须满足所有 3 个标准或 3 个标准中的任何一个吗?

标签: mysql sql multiple-conditions


【解决方案1】:

filter 的值不能同时为 10、15 和 18。

您可能希望该值为 10 OR 15 OR 18:

SELECT * FROM products p
LEFT JOIN filter pf ON (p.product_id = pf.product_id)
WHERE pf.filter = 10
OR pf.filter = 15
OR pf.filter = 18
GROUP BY p.product_id

【讨论】:

  • or(双关语)in
  • @xQbert,正确 :) in 将在这里给出相同的结果。
【解决方案2】:

尝试使用GROUP BYHAVING 来获取具有所有三个过滤器的产品。然后加入其余信息:

SELECT p.*
FROM products p JOIN
     (SELECT pf.product_id
      FROM filter pf
      WHERE pf.filter IN (10, 15, 18)
      GROUP BY pf.product_id
      HAVING COUNT(*) = 3
     ) pf
     ON p.product_id = pf.product_id;

【讨论】:

  • 看起来很有希望,明天试试这个
【解决方案3】:

你的问题是值不能同时是 10 和 15 和 18,试试这个:

SELECT * FROM products p
LEFT JOIN filter pf ON (p.product_id = pf.product_id)
WHERE pf.filter = 10
OR pf.filter = 15
OR pf.filter = 18
GROUP BY p.product_id

或更好

SELECT * FROM products p
LEFT JOIN filter pf ON (p.product_id = pf.product_id)
WHERE pf.filter IN (10, 15, 18)
GROUP BY p.product_id

【讨论】:

  • 是的,这就是查询从一开始的样子。唯一的问题是它应该是 AND 而不是 OR。所以.. WHERE pf.filter IN (10, 15, 18, 999) 应该没有结果,因为没有 filter_id = 999
  • IN (10, 15, 18, 999) 等价于 OR filter=10 OR filter=15 OR filter=18 OR filter = 999。所以即使你没有 999 它仍然显示第 10、15 和 18 行
猜你喜欢
  • 2021-12-20
  • 2015-06-16
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 2014-09-11
  • 2020-05-31
相关资源
最近更新 更多