我试图运行可以返回所有用户帖子的sql查询,如果用户在提交帖子时附加了图片,也可以加入帖子图片。但是使用下面的代码,只有在post table
表post 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
答案 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_posts
至RIGHT 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