MySQL连接问题

标签 mysql left-join inner-join

您好,我正在努力编写一个特定的 MySQL 连接查询。

我有一个包含产品数据的表,每个产品可以属于多个类别。使用链接表可以满足这种 m:m 关系。

对于这个特定的查询,我希望检索属于给定类别的所有产品,但对于每个产品记录,我还想返回该产品所属的其他类别。

理想情况下,我希望在类别表上使用内部联接来实现此目的,而不是对每个产品记录执行额外的查询,这会非常低效。

我的简化架构大致设计如下:

产品表:

product_id, name, title, description, is_active, date_added, publish_date, etc....

类别表:

category_id, name, title, description, etc...

产品类别表:

product_id, category_id

我编写了以下查询,它允许我检索属于指定 category_id 的所有产品。但是,我真的很难弄清楚如何检索产品所属的其他类别。

SELECT p.product_id, p.name, p.title, p.description
FROM prod_products AS p
LEFT JOIN prod_product_category AS pc
ON pc.product_id =  p.product_id
WHERE pc.category_id = $category_id
AND UNIX_TIMESTAMP(p.publish_date) < UNIX_TIMESTAMP()
AND p.is_active = 1
ORDER BY p.name ASC

我很乐意只检索与每个返回的产品行相关的类别 ID,因为我会将所有类别数据存储在一个对象中,而我的应用程序代码可以处理其余部分。

非常感谢,

理查德

最佳答案

SELECT p.product_id, p.name, p.title, p.description, 
  GROUP_CONCAT(otherc.category_id) AS other_categories
FROM prod_products AS p
JOIN prod_product_category AS pc
  ON pc.product_id =  p.product_id
LEFT JOIN prod_product_category AS otherc
  ON otherc.product_id = p.product_id AND otherc.category_id != pc.category_id
WHERE pc.category_id = $category_id
  AND UNIX_TIMESTAMP(p.publish_date) < UNIX_TIMESTAMP()
  AND p.is_active = 1
GROUP BY p.product_id
ORDER BY p.name ASC

关于MySQL连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2716969/

相关文章:

php - 在 Joomla 中的表之间移动行

mySQL 查询 2 表左连接

mysql - 在 Mysql 中,左/右连接两次获取同一列的结果

mysql - 复杂的mySQL 两表查询

mysql - mysql 内连接多个表

mysql - 组合多个表并使用 COALESCE 的奇怪行为

php - 为什么mysql查询需要很长时间才能收到结果?

mysql - 如何保持 sequelize 与 AWS Lambda 函数的连接(或加速初始连接)?

php - 使用 d3.json() 从 php 获取 json 数据不起作用

mysql - 无法弄清楚复杂的查询