SQL GROUP CONCAT和LEFT JOIN仅从数据库返回一个结果

时间:2017-11-23 11:49:00

标签: mysql sql phpmyadmin group-concat

我试图运行可以返回所有用户帖子的sql查询,如果用户在提交帖子时附加了图片,也可以加入帖子图片。但是使用下面的代码,只有在post tablepost id表上时才会返回post image id的数据,否则会忽略没有图像的所有帖子。如何编写一个返回带有图像的帖子和没有?

的查询

以下是我的表结构

表vendor_account

eu_vendor_id | uname |  mypagename
-------------|-------|--------------
v801         | peter |  pageA
v900         | john  |

表social_posts

social_page_id  |  post_id | vendor_owner_id | post_body_message
----------------|----------|-----------------|------------------------------
pageA           |  p100    |  v801            | This is post without image
pageA           |  p101    |  v801            | This is post with 2 images
pageA           |  p102    |  v801            | This is post with 1 image

表social_post_photos

img | post_image_id | photo_url
----|---------------|---------------
1   | p101          | image1.png
2   | p101          | image2.png
3   | p102          | image01.png

我的SQL查询

SELECT 
im.post_image_id, p.post_body_message,
group_concat(im.photo_url ORDER BY im.photo_url) imgs
FROM social_post_photos im

LEFT JOIN social_posts p
ON p.post_id = im.post_image_id

INNER JOIN vendor_account v
ON p.vendor_owner_id = v.eu_vendor_id

WHERE p.social_page_id = 'pageA'
AND p.vendor_owner_id = 'v801'

GROUP BY im.post_image_id

目前的结果 当我运行上面的SQL查询时,它将返回它将导致如下所示并忽略其他没有附加图像的帖子

post_image_id  |  post_body_message         |  photo_url
---------------|----------------------------|-------------------------
p101           | This is post with 2 images | [IMAGE1.PNG],[IMAGE2.PNG]
p102           | This is post with 1 image  | [IMAGE01.PNG]

我的预期结果 我希望有一个查询可以返回所有数据,即使它没有图像,因为我使用LEFT JOIN,因为帖子不会附加照片

post_image_id  |  post_body_message         |  photo_url
---------------|----------------------------|-------------------------
p101           | This is post with 2 images | [IMAGE1.PNG],[IMAGE2.PNG]
p102           | This is post with 1 image  | [IMAGE01.PNG]
p100           | This is post without image | null

4 个答案:

答案 0 :(得分:0)

LEFT JOIN时,将右侧表条件从WHERE子句移到ON子句(否则您将获得常规INNER JOIN结果):

SELECT 
im.post_image_id, p.post_body_message,
group_concat(im.photo_url ORDER BY im.photo_url) imgs
FROM social_post_photos im

LEFT JOIN social_posts p
ON p.post_id = im.post_image_id
AND p.social_page_id = 'pageA'
AND p.vendor_owner_id = 'v801'

INNER JOIN vendor_account v
ON p.vendor_owner_id = v.eu_vendor_id


GROUP BY im.post_image_id

请注意,您的group by无效。它不会在较新的MySQL版本上执行(除非在兼容模式下),可能会使用较旧的MySQL版本返回不可预测的结果。一般GROUP BY规则说:如果指定了GROUP BY子句,SELECT列表中的每个列引用必须标识分组列或者是set函数的参数!

答案 1 :(得分:0)

由于您要从social_post_photos中进行选择,因此您需要将联接更改为social_postsRIGHT JOIN,以便从social_posts获取所有记录。由于我厌恶RIGHT JOIN,并且尚未找到使用其中一个的充分理由,我建议您更改表格的顺序,以便从social_posts AND LEFT JOIN到{ {1}}:

social_post_photos

N.B。在执行此操作时,您还需要选择(并分组)SELECT p.post_id, p.post_body_message, group_concat(im.photo_url ORDER BY im.photo_url) imgs FROM social_posts p LEFT JOIN social_post_photos im ON im.post_image_id = p.post_id INNER JOIN vendor_account v ON p.vendor_owner_id = v.eu_vendor_id WHERE p.social_page_id = 'pageA' AND p.vendor_owner_id = 'v801' GROUP BY p.post_id, p.post_body_message 而不是p.post_id

答案 2 :(得分:0)

从你的帖子:

INNER JOIN vendor_account v
ON p.vendor_owner_id = v.eu_vendor_id

此部分会将您的搜索结果降至最多2个,因为您只有1个供应商ID(彼得),这是您唯一的结果(我认为这是您获得的单行)。

为了获得这两行,您需要LEFT JOIN而不是INNER JOIN最后一个表。 Where条件只会选择一个帖子和一个供应商,我不确定你想要的是什么。

SELECT 
im.post_image_id, p.post_body_message,
group_concat(im.photo_url ORDER BY im.photo_url) imgs
FROM social_post_photos im

LEFT JOIN social_posts p
ON p.post_id = im.post_image_id

LEFT JOIN vendor_account v
ON p.vendor_owner_id = v.eu_vendor_id

-- -- I DON'T KNOW IF THIS IS RIGHT?!
-- WHERE p.social_page_id = 'pageA'
-- AND p.vendor_owner_id = 'v801'

GROUP BY im.post_image_id

这里有你需要的一切:http://sqlfiddle.com/#!9/e7ce30/17

答案 3 :(得分:0)

你可以尝试下面的代码。



SELECT 
im.post_image_id, p.post_body_message,
group_concat(im.photo_url ORDER BY im.photo_url) imgs
FROM social_posts p

LEFT JOIN social_post_photos im
ON p.post_id = im.post_image_id

INNER JOIN vendor_account v
ON p.vendor_owner_id = v.eu_vendor_id

WHERE p.social_page_id = 'pageA'
AND p.vendor_owner_id = 'v801'

GROUP BY im.post_image_id