【问题标题】:Select a product where it belongs in 2 different categories选择属于 2 个不同类别的产品
【发布时间】:2015-03-02 19:11:57
【问题描述】:

这是表 measuremart_product_categories:

我想要做的是选择商品在类别:307 和类别:383 中的商品 ID。 像这样的东西: (我知道“AND”表达式是完全错误的,输入它作为我试图实现的一个例子)。

SELECT * 
FROM uhhu_virtuemart_products_en_gb AS a 
INNER JOIN uhhu_virtuemart_product_categories AS b ON a.virtuemart_product_id=b.virtuemart_product_id 
WHERE b.virtuemart_category_id=307 AND b.virtuemart_category_id=383

有没有一种 sql 方法来实现这一点?也许我需要创建一个新表并以某种方式建立关系?我认为使用一些 php 并分离查询的方法非常蹩脚,但即使它有效,它也会非常复杂并且不好的编码方式。 提前致谢。

编辑:同时添加 products_en_gb 表:

【问题讨论】:

  • 你试过OR而不是AND吗?
  • 您有正确的查询表单,您只是在测试连接的同一侧。你有“其中 b.id = 307 和 b.id = 383”,这显然是不可能的,所以你没有得到任何结果。只需将其中一个“b”更改为“a”:“其中 a.id = 307 和 b.id = 383”

标签: mysql sql select group-by in-operator


【解决方案1】:

试试这个:

SELECT * 
FROM uhhu_virtuemart_products_en_gb AS a 
WHERE a.virtuemart_category_id IN (307, 383)
GROUP BY a.virtuemart_product_id 
HAVING COUNT(1) = 2

【讨论】:

  • products_en_gb 只包含产品的 id,name,sku,不包含 category_id!
  • ^1 这很好,可以轻松扩展到更多类别。但是,它可能会因意外将同一类别分配给产品两次而破坏。
  • 好吧,这行得通!如果产品属于 2 个以上的类别,我应该每次都通过 php 更改“HAVING COUNT(1) = x”值,对吗?
【解决方案2】:

如果您想要一个产品分为两个类别,那么您可以将 uhhu_virtuemart_products_en_gb 与 itselt 连接起来,这样您就有两个类别列。这是一个简单的例子:

select p1.product_id from
product_category p1
inner join product_category p2 using(product_id)
where p1.category_id=307
and p2.category_id=383

解决此类问题的一种方法是问自己“结果行中必须出现什么才能让我过滤结果?”

这不是唯一的方法,但我认为这是一种相当简单的可视化方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 2010-09-16
    • 1970-01-01
    • 2021-09-16
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多