【问题标题】:SQL Filtering by categorySQL 按类别过滤
【发布时间】:2012-06-16 21:20:29
【问题描述】:

pro_id | Category<br>--------+---------<br>  25   | electronics<br>  27   | Electrical<br>  25   | household<br>  27   | electronics<br>  25   | industrial

上面是我的数据库表。我想按类别过滤结果。如果选择“电子产品”类别,则结果应包括产品 id 25 和 27。这很容易。但我想按多个类别过滤。例如,如果我选择“电子产品”和“家庭”,结果应该只有产品 id 25。

【问题讨论】:

  • 认为你应该怎么做?如果您能够证明您拥有tried something for yourself,您可能会发现您获得了更好的答案质量并且人们更愿意帮助您。
  • 如果你猜怎么做,你猜会是什么?

标签: mysql sql


【解决方案1】:

在此处查看示例:http://sqlfiddle.com/#!2/09028/7

通过 pro_id 将您的表加入到自身中,然后按类别过滤以选择具有这两个类别的所有产品:

SELECT prod1.pro_id
FROM       prod AS prod1
INNER JOIN prod AS prod2 ON prod1.pro_id = prod2.pro_id
WHERE prod1.Category = 'electronics'
  AND prod2.Category = 'household';

选择具有至少一个类别的所有产品:

SELECT prod.pro_id
FROM  prod
WHERE prod.Category = 'electronics'
   OR prod.Category = 'household'
GROUP BY prod.pro_id;

【讨论】:

  • 为什么加入?为什么不select * from prod Where prod.Category = 'electronics' OR prod.Category = 'household' ?
  • 它是必需的,否则 pro_id=27 也会被选中,它只有两个必需的类别之一。
  • @ElVieejo:是的 - 尚不清楚产品是否必须是两者的一部分才能满足查询。
  • 我添加了两种可能的情况。
  • 计算机在 sqlfiddle 中对我说 yesyoutube.com/watch?v=uYhtEBfLMlo :)
【解决方案2】:

如果您只想要符合这两个条件的产品,则需要一个 HAVING 子句...

SELECT
      p.pro_id
   FROM       
      prod p
   where
      p.category in ('electronics', 'household')
   having
      count(*) = 2

这样做的好处是,如果您想要 3 个或更多类别,您只需将它们添加到“IN”子句并将计数更改为 3、4 或其他...

【讨论】:

    【解决方案3】:

    不应该,因为您有多个 ID 共享相同的类别名称。获得所需内容的唯一方法是使用另一个字段来唯一标识每条记录,否则重复数据会让您一团糟。

    【讨论】:

    • 假设它已经是product_categories 表:) 当然不同的类别名称应该放在单独的表中。
    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2020-08-20
    相关资源
    最近更新 更多