2010-10-07 8 views
-2

J'ai essayé de trouver une autre façon d'accomplir cette tâche sur une autre question sur ce site, mais je pense que je la rends trop difficile.Mysql/php - Requête Question

Voici ce que j'ai: Table avec et ImageID, ImageName, GalleryID une autre table avec commentaires, auteur, date, ImageID

Ce que je veux faire est de faire une requête où je trouve tous les Images ayant un ID de galerie = 42. En outre, je voudrais saisir tous les commentaires associés à chaque image (via l'ImageID) et les concaténer en une seule valeur. Par exemple:

ImageID: 1234, ImageName: IMG425, GalleryID: 42, Commentaires: Cool! ||| John Smith ||| 2010-09-06 ~~ Belle prise de vue! ||| Richard Clark ||| 2010 -10-01 ~~ Je me souviens de cette course. ||| Susan Edwards ||| 2010-10-04

Je dois concaténer tous les résultats du tableau des commentaires qui sont pour chaque image et les mettre en tant que une seule valeur, alors je peux les analyser via PHP dans le corps de ma page.

+0

Pourriez-vous partager du code et SQL avec nous? –

+0

SELECT GalleryData.ID, GalleryData.FileName, GalleryData.GalleryID, GalleryData.Description, Galleries.GalleryName, Galleries.GalleryFolder, Comments.ID, Comments.'Comment', Comments.CommentAuthor, Comments.CommentDate dE GalleryData INNER JOIN Galeries sUR GalleryData.GalleryID = Galleries.GalleryID LEFT JOIN Commentaires sur GalleryData.ID = Comments.ID Cela donne des enregistrements d'images en double quand il y a plus de 1 commentaire associé à une image. – dragboatrandy

Répondre

0

il y a une fonction dans une base MySQL appelé GROUP_CONCAT Je nai vraiment essayé, mais je pense que cela pourrait aider

Bonne chance

ÉDITÉ:

La requête pourrait être quelque chose comme

SELECT img.id,img.name,img.galleryID, 
    GROUP_CONCAT(com.author,comment.date,com.content 
       ORDER BY comm.date SEPARATOR '|||') 
FROM images img JOIN comments com ON img.imageID=com.imageID 
GROUP BY img.id,img.name,img.galleryID; 

ou quelque chose comme ça, mais je ne sais pas si group_concat fonctionne avec les jointures

+0

J'ai essayé ceci, mais il m'a donné un seul résultat.SELECT GalleryData.ID, GalleryData.FileName, GalleryData.GalleryID, GalleryData.Description, Galleries.GalleryName, Galleries.GalleryFolder, GROUP_CONCAT (Comments.CommentAuthor, Comments.CommentDate, Comments.'Comment' ORDER BY Comments.CommentDate SÉPARATEUR '|||') DE GalleryData INNER JOIN ON Galeries GalleryData.GalleryID = Galleries.GalleryID LEFT JOIN Commentaires sur GalleryData.ID = Comments.ID O Gallery GalleryData.GalleryID = 42 – dragboatrandy

+0

avez-vous oublié le dernier GROUP BY? ou vous n'avez plus de caractères = P .. essayez une simple requête pour vérifier si group_concat() est votre réponse, peut-être juste en montrant l'imageID et les auteurs des commentaires .. – pleasedontbelong

0

Pourquoi ne pas simplement extraire les données des commentaires dans une requête séparée? Bien que le déplacement supplémentaire vers la base de données ne soit pas idéal, il y aura probablement autant de frais que de concaténation et d'extraction de ces données, et la séparation des requêtes rendra votre code moins brouillé. GROUP_CONCAT() est le chemin à parcourir et les autres réponses sont proches.

+0

J'ai essayé cela. Voir http://stackoverflow.com/questions/3884347/php-mysql-array-pop-missing-first-value – dragboatrandy

+1

Cela ressemble à un non-sequitur à mon avis. Juste parce que votre code original contient une faille (et donné les commentaires sur cette question, il semble que vous avez des options viables pour corriger le problème d'origine). Vous dites même dans votre question que vous compliquez peut-être le problème. Dans mon expérience, réécrire le code simple à force brute une solution conduit juste à toutes sortes d'angoisse plus tard. – jwiscarson

1

BAISER.

SELECT 
    ImageID, ImageName, GalleryID 
    , GROUP_CONCAT(
     CONCAT_WS('|||', Comment.author, Comment.date, Comment.content) 
     SEPARATOR '~~' 
    ) as comments 
FROM 
    Images 
    JOIN Galleries USING (GalleryID) 
    JOIN Comments USING (ImageID) 
WHERE 
    GalleryID = 42 
GROUP BY 
    ImageID, ImageName, GalleryID 

Notez que GROUP_CONCAT() a une longueur maximale très courte par défaut. Vous devrez peut-être exécuter

SET group_concat_max_len = 65535; 
+0

La partie concaténer fonctionne, mais elle ne donne que les images qui ont des commentaires. Je veux qu'il montre toutes les images, mais incluez les commentaires avec ceux qui ont réellement des commentaires. Il y a environ 400 images avec ce GalleryID et quand je lance la requête, seulement 3 montrent, parce que ce sont ceux avec des commentaires. – dragboatrandy

+0

Oh désolé. Gauche rejoindre sur Commentaires alors :) –