【问题标题】:Filter one category of a product, but bring all categories of the filtered products过滤一个产品的一个类别,但把过滤后的产品的所有类别都带进来
【发布时间】:2018-04-12 02:37:04
【问题描述】:

事情就是这样。

我有一个查询,它带来了我数据库中的所有产品。这些产品属于一个或多个类别。所以我有 3 张桌子。
- 产品表
- 类别表
- 保存这两者之间关系的表。

我在获取产品时使用 GROUP_CONCAT 来获取产品所属的所有类别的名称,它工作正常。我得到了我期望的结果。

问题出在我过滤一个类别时。然后 GROUP_CONCAT 不再起作用,它只带来来自所需类别的产品,而不是该产品所属的所有类别。

这是我不过滤特定类别时的查询。

SELECT p.*, GROUP_CONCAT( c.title SEPARATOR ', ') as category
FROM products p
INNER JOIN products_categories_relation pcr ON pcr.product_id = p.id
INNER JOIN categories c ON pcr.category_id = c.id
WHERE p.status = 1
GROUP BY p.id
ORDER BY p.name ASC
LIMIT 16
OFFSET 0

这是我过滤特定类别时的查询:

SELECT p.*, GROUP_CONCAT( c.title SEPARATOR ', ') as categories
FROM product p
INNER JOIN products_categories_relation pcr ON pcr.product_id = p.id
INNER JOIN categories c ON pcr.category_id = c.id
WHERE p.status = 1
AND pcr.category_id = 27 
GROUP BY p.id
ORDER BY p.name ASC
LIMIT 16
OFFSET 0

谁能帮帮我?

【问题讨论】:

  • 那么 PHP 是从哪里来的?
  • 已经移除了 PHP 标签。
  • 这里有一些示例数据会很好。顺便说一句,您的查询无效,因为您正在执行 SELECT p.* 而仅按 id 分组。

标签: mysql


【解决方案1】:

你可以试试这个

SELECT p.*, GROUP_CONCAT( c.title SEPARATOR ', ') as categories
FROM product p
INNER JOIN products_categories_relation pcr ON pcr.product_id = p.id
INNER JOIN categories c ON pcr.category_id = c.id
WHERE p.status = 1
AND exists( select * from products_categories_relation where products_categories_relation.category_id = 27 and products_categories_relation.product_id = p.id )
GROUP BY p.id
ORDER BY p.name ASC
LIMIT 16
OFFSET 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    相关资源
    最近更新 更多