MySQL连接问题
嗨,我正在努力编写一个特定的MySQL连接查询 我有一个包含产品数据的表,每个产品可以属于多个类别。使用链接表可以满足此m:m关系 对于这个特定的查询,我希望检索属于给定类别的所有产品,但对于每个产品记录,我还希望返回该产品所属的其他类别MySQL连接问题,mysql,left-join,inner-join,Mysql,Left Join,Inner Join,嗨,我正在努力编写一个特定的MySQL连接查询 我有一个包含产品数据的表,每个产品可以属于多个类别。使用链接表可以满足此m:m关系 对于这个特定的查询,我希望检索属于给定类别的所有产品,但对于每个产品记录,我还希望返回该产品所属的其他类别 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
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
理想情况下,我希望使用categories表上的内部联接来实现这一点,而不是对每个产品记录执行额外的查询,这将非常低效
我的简化模式大致设计如下:
产品表:
product_id, name, title, description, is_active, date_added, publish_date, etc....
类别表:
category_id, name, title, description, etc...
产品类别表:
product_id, category_id
我已经编写了以下查询,它允许我检索属于指定类别\u 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
选择p.product\u id、p.name、p.title、p.description
来自prod_products作为p
左连接产品类别为pc
在pc上。产品\u id=p.产品\u id
其中pc.category\u id=$category\u id
和UNIX_时间戳(p.publish_date)
我很乐意检索与每个返回的产品行相关的类别id,因为我将把所有类别数据存储在一个对象中,我的应用程序代码可以处理其余的内容
非常感谢,
Richard选择p.product\u id、p.name、p.title、p.description、,
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
与其他类别相同的组类别(其他C.类别id)
来自prod_products作为p
以pc身份加入产品类别
在pc上。产品\u id=p.产品\u id
将产品类别作为其他类别左键联接
在otherc.product_id=p.product_id和otherc.category_id!=个人电脑类别识别码
其中pc.category\u id=$category\u id
和UNIX_时间戳(p.publish_date)
您将使用product_category表的内部联接,在那里进行左联接是没有意义的,因为您在条件中使用了其中的值。然后在product_category表上执行左联接以获取其他类别,并联接数据的类别:
select
p.product_id, p.name, p.title, p.description,
c.category_id, c.name, c.title
from
prod_products p
inner join prod_product_category pc on pc.product_id = p.product_id
left join prod_product_category pc2 on pc2.product_id = p.product_id
left join prod_categories c on c.category_id = pc2.category_id
where
pc.category_id = @category_id and
unix_timestamp(p.publish_date) < unix_timestamp() and
p.is_active = 1
order by
p.name
选择
p、 产品标识、零件名称、零件名称、零件描述、,
c、 类别识别号,c.姓名,c.头衔
从…起
产品
内部连接产品类别pc上的pc.product\U id=p.product\U id
在pc2.product\U id=p.product\U id上左连接产品\U产品\U类别pc2
在c.category\u id=pc2.category\u id上左连接产品类别c
哪里
pc.category\u id=@category\u id和
unix\u时间戳(p.publish\u date)
太棒了,非常感谢。我从未想过第二次对该表执行联接,也没有想过使用not运算符。