cuốn sách gpt4 ai đã làm

mysql - SQL : Get Products from a category but also must be in another set of categories

In lại Tác giả: Hồ Xil 更新时间:2023-11-01 07:04:28 26 4
mua khóa gpt4 Nike

我目前陷入困境。场景是这样的。我有可能与多个类别相关联的产品。数据结构如下图:

Products Table:
product_id name
1 Lemon
2 Kiwis
3 Cheese

产品到类别表

product_id category_id
1 1
1 2
1 3
2 1
2 3
3 2
3 4

类别表(查询中不需要,但将其添加到此处以帮助可视化正在发生的事情)

category_id name
1 Fruit
2 Yellow
3 Round
4 Dairy

我在这里苦苦挣扎的是,最初我想获得水果类别(类别 id 1)中的所有产品,但我还想检查水果是否是黄色的。请记住,黄色不会是唯一的过滤器,有时我会想要退回黄色和橙色的水果,但是由于奶酪是黄色的,我不能退回它,因为它不是水果。然而,为了让事情变得更简单,我总是知道我将以水果类别为基础。

数据库结构不能改变,因为它是一个opencart数据库结构。

这是我的尝试:

SELECT GROUP_CONCAT(DISTINCT p2c2.category_id SEPARATOR ',') as categories 
FROM oc_product_to_category p2c
LEFT JOIN oc_product p ON (p.product_id = p2c.product_id)
LEFT JOIN oc_product_to_category p2c2 ON (p.product_id = p2c2.product_id)
WHERE p2c.category_id IN ('1','2')

除了会返回 Cheese 之外,这种方法是可行的。

注意:我使用 Group Concat,因为在所有这一切结束时,我的目标不是返回与这些类别匹配的产品,而是基于过滤器,我想从与此匹配的产品中返回另一个类别列表标准。所以:

场景:

获取符合类别标准的产品返回这些产品的类别。

Bất kỳ trợ giúp sẽ được đánh giá rất cao.

câu trả lời hay nhất

这种类型的问题称为关系 split .

有两种常见的解决方案:

  1. 第一个解决方案将匹配类别串在一起并与固定字符串进行比较:

    SELECT p2c.product_id
    FROM oc_product_to_category p2c
    GROUP BY p2c.product_id
    HAVING GROUP_CONCAT(p2c.category_id SEPARATOR ',' ORDER BY p2c.category_id) = '1,2'
  2. 第二种解决方案为每个必需值执行JOIN:

    SELECT p.product_id 
    FROM oc_product p
    INNER JOIN oc_product_to_category p2c1
    ON (p.product_id = p2c1.product_id AND p2c1.category_id = 1)
    INNER JOIN oc_product_to_category p2c2
    ON (p.product_id = p2c2.product_id AND p2c2.category_id = 2)

我在演示文稿中介绍了这些解决方案 SQL Query Patterns, Optimized .我在测试中发现连接解决方案的性能要好得多。


@Tom 的建议是正确的,这是完整查询中的样子:

    SELECT p.product_id, GROUP_CONCAT(p2c3.category_id SEPARATOR ',') AS categories
FROM oc_product p
INNER JOIN oc_product_to_category p2c1
ON (p.product_id = p2c1.product_id AND p2c1.category_id = 1)
INNER JOIN oc_product_to_category p2c2
ON (p.product_id = p2c2.product_id AND p2c2.category_id = 2)
INNER JOIN oc_product_to_category p2c3
ON (p.product_id = p2c3.product_id)
GROUP BY p.product_id;

@Tom 建议的 DISTINCT 不是必需的,因为您的 p2c 表应该对 (product_id, category_id) 具有 UNIQUE 约束。

关于mysql - SQL : Get Products from a category but also must be in another set of categories,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17662603/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress