Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL连接问题_Mysql_Left Join_Inner Join - Fatal编程技术网

MySQL连接问题

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

嗨,我正在努力编写一个特定的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 =  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运算符。