J'essaie d'exécuter une requête SQL qui peut renvoyer toutes les publications de l'utilisateur et également rejoindre l'image de la publication si l'utilisateur a joint l'image lors de la soumission d'un message. Mais en utilisant le code ci-dessous, il ne renvoie que les données de post table lorsque le post id quitte la table post image id, sinon il ignorera tous les messages sans images. Comment puis-je écrire une requête qui renvoie à la fois un message avec et sans image?

Voici ma structure de table

Table vendor_account

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

Tableau 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

Tableau social_post_photos

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

Ma requête 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

Résultat actuel Lorsque j'exécute la requête sql ci-dessus, elle retournera le résultat comme ci-dessous et ignorera les autres messages qui n'ont pas d'image attachée

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]

Mon résultat attendu Je veux avoir une requête qui peut renvoyer toutes les données même si elle n'a pas d'image depuis que j'ai utilisé LEFT JOIN car ce n'est pas obligatoirement que le message aura une photo attachée

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
Peter 23 nov. 2017 à 14:48

4 réponses

Meilleure réponse

Puisque vous sélectionnez parmi social_post_photos, vous devrez changer votre jointure en social_posts en RIGHT JOIN afin d'obtenir tous les enregistrements de social_posts. Puisque je déteste les RIGHT JOIN s, et que je n'ai pas encore trouvé de bonne raison d'en utiliser un, je vous suggère plutôt de changer l'ordre des tableaux pour sélectionner de social_posts ET LEFT JOIN à { {X7}}:

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

N.B. Pour ce faire, vous devez également sélectionner (et grouper par) p.post_id au lieu de im.post_image_id.

0
GarethD 23 nov. 2017 à 11:53

À partir de votre message:

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

Cette partie réduira vos résultats à 2 maximum, car vous n'avez qu'un seul identifiant de fournisseur (peter), c'est votre seul résultat (je suppose que c'est la seule ligne que vous obtenez).

Pour obtenir les deux lignes, vous devrez LEFT JOIN au lieu de INNER JOIN la dernière table. De plus, la condition Où sélectionnera uniquement un article et un fournisseur, je ne suis pas sûr que ce soit ce que vous voulez.

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

Voici un violon avec tout ce dont vous avez besoin: http://sqlfiddle.com/#!9/e7ce30/ 17

0
Héctor Álvarez 23 nov. 2017 à 14:48

Vous pouvez essayer le code ci-dessous.

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
0
Pragna 23 nov. 2017 à 12:03

Lorsque LEFT JOIN, déplacez les conditions de la table de droite de la clause WHERE vers la clause ON (sinon, vous obtiendrez un résultat INNER JOIN normal):

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

Nothe que vous avez un group by invalide. Il ne s'exécutera pas sur les nouvelles versions de MySQL (sauf en mode de compatibilité), peut renvoyer des résultats imprévisibles avec les anciennes versions de MySQL. La règle générale GROUP BY dit: Si une clause GROUP BY est spécifiée, chaque référence de colonne dans la liste SELECT doit soit identifier une colonne de regroupement, soit être l'argument d'une fonction d'ensemble!

0
jarlh 23 nov. 2017 à 11:50
47454844