【问题标题】:Mysql: applying conditions on multiple recordsMysql:对多条记录应用条件
【发布时间】:2020-02-13 06:20:25
【问题描述】:

我有一个 MySQL 表来存储产品变体选项值(例如:颜色、尺寸、重量、产品变体的高度)。它包含以下数据。

我在前端有一个过滤器选项,用户可以在其中选择过滤器选项,例如颜色、尺寸、重量、高度等,我需要根据过滤器值显示产品变体。

在上面的例子中:option_id = 110 表示大小。 option_id = 109 表示颜色。假设用户选择的尺码 = 31(XL),颜色 = 27(红色),

我必须找到 option_id = '110' 的 product_variant_id 并且 option_value_id = 31 AND option_id = '109' AND option_value_id = 27。 (结果应该是 id 为 266 和 267 的记录)

只有一个 product_variant_id 是 140。

我试过了

SELECT * FROM product_variant_option_values WHERE (option_id = '110' AND option_value_id = 31) OR (option_id = '109' AND option_value_id = 27)

但它没有返回我想要的,上面的查询返回

【问题讨论】:

  • 什么返回你的声明?
  • 问题已更新,查询结果已添加。

标签: mysql sql


【解决方案1】:

好的,看到你现在得到的结果后。 如果我理解正确,您希望 product_variant_id 具有您提到的两个条件。 因此,查询的一个选项可能是:

SELECT product_variant_id
FROM product_variant_option_values 
WHERE (option_id = '110' AND option_value_id = 31) OR (option_id = '109' AND option_value_id = 27)
GROUP BY product_variant_id
HAVING count(*) = 2

这意味着,您计算每个 product_variant_id 返回的行数,并且只返回有 2 行的行数。这意味着满足了这两个条件。

【讨论】:

  • 这是我尝试过的,但我应该只得到 140,如果问题中有这个查询,请查看结果。
  • 抱歉改了答案,看到你的更新后,我才意识到发生了什么。
  • WHERE (option_id, option_value_id) IN (('110', 31), ('109', 27)) 更清晰更短。
  • @Akina 返回错误结果,结果应该是 product_variant_id = 140 的记录。您的查询返回多条记录
  • @Joyal 我的问题?我只显示了答案代码中一行的替换 - 它不能改变输出。你在替换的某个地方犯了一个错误。也许你已经删除了剩下的 2 行?
【解决方案2】:

我认为您可以做的是添加一个COUNT() 操作,以查看是否满足两个过滤条件。如下所示:

SELECT   product_variant_id,COUNT(*) cnt 
FROM     product_variant_option_values 
WHERE    (option_id = '110' AND option_value_id = 31) 
  OR     (option_id = '109' AND option_value_id = 27)
GROUP BY product_variant_id
HAVING   cnt >= 2;

product_variant_id 分组,COUNT() 的结果为 2 或更多;如果过滤条件总是为 2,那么 HAVING cnt=2 就足够了。这个查询类似地可以这样写:

SELECT   product_variant_id,COUNT(*) cnt 
FROM     product_variant_option_values 
WHERE    option_id in ('110','109') 
  AND    option_value_id IN (27,31)
GROUP BY product_variant_id
HAVING   cnt >= 2;

小提琴示例:https://www.db-fiddle.com/f/9kKmyHsSAMNk4BBPDWLHFh/3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    相关资源
    最近更新 更多