SQL嵌套查询 - 第2部分

时间:2014-07-11 16:31:14

标签: php sql join left-join

就在前几天,我问了一个关于将查询嵌套在一起的问题 - 简而言之,它是关于如何在第二个表中可能存在或不存在链接行时从两个不同的相关表中提取数据。这导致我走向LEFT / RIGHT JOINS并且很容易接受。现在,不过我遇到了一个全新的问题,这让我很难过。

当使用LEFT / RIGHT JOINS回退信息时(假设它在本问题的其余部分只是一个LEFT JOIN),在表B中有多个匹配行的情况下,每次找到表B中的匹配时,表A的信息被拉回,这导致全新的行被拉回。有没有办法在执行LEFT JOINS时聚合表B中的信息?

例如,假设我们有一个产品表只有一个产品行图片表 6个图像行,全部链接到products表中的一个产品。

让我们说我们然后使用查询:

SELECT product_name, large_image, medium_image FROM products
LEFT JOIN images ON images.image_product_Id = products.productId

这将拉回6行,每行包含product_name的重复信息,但是包含large_image和medium_image的唯一信息。

有没有办法将这些信息拉回一行,图像表中的行嵌套了?返回一行的结果,以及作为列拉回的关联数组中的6个图像的图像信息?

理想情况下,此信息会以:

的形式返回
[
  1 => [ product_name => 'Apple iPhone',
         images => [
         {
            large_image=>'image1.jpg',
            'medium_image'=>'image1_m.jpg'
         },
         {
            large_image=>'image2.jpg',
            medium_image=>'image2_m.jpg'}
            ...
         ]
       ]
]

我目前唯一能想到的解决方案是在一个查询中提取产品的信息:

SELECT product_name, productId FROM products

并在迭代该信息时,对每行进行后续查询以获取该产品的所有图像:

SELECT large_image, medium_image FROM images WHERE images.image_product_Id 
= '$productId'

其中' $ productId'是我输入第二个查询的参数,它代表第一个查询的productId列。这似乎不仅效率低下,而且编程实践也不好。有人能指出我正确的方向吗?

我希望我能清楚地说出来 - 如果没有,请让我知道我能做些什么更好!

提前致谢:)

1 个答案:

答案 0 :(得分:4)

根据您的问题,我找到了一个适合您的答案,请参阅下面的 SQL

SELECT product_name, 
       GROUP_CONCAT(DISTINCT large_image) AS LargeImages,
       GROUP_CONCAT(DISTINCT medium_image) AS medium_images 
FROM products 
LEFT JOIN images ON images.image_product_Id = products.productId 
GROUP BY productId