2014-05-20 7 views
0

J'ai 4 tables dans une base de données mysql existante d'un site de type répertoire. Tableau mt_links contient des informations de base pour chaque liste Tableau mt_cl contient qui liste ci-dessus est dans quelle catégorie (je veux seulement cat_id = 1) Tableau mt_cfvalues ​​contient plus de détails pour chaque liste Il peut avoir répété les valeurs Tableau mt_images contient les noms d'image pour chaque liste.Récupérer des enregistrements de plusieurs tables certaines distinctes, d'autres non

Je veux tous les enregistrements de mt_links où le mt_cl cat_id = 1, et pour chacun de ces enregistrements, j'ai besoin de tous les enregistrements dans mt_cfvalues ​​et cf_images correspondant à link_id.

J'ai mis en place un select avec les jointures Group_Concat et left, mais j'ai fini par répéter des valeurs dans mes résultats. J'ai ajouté Distinct, qui a guéri les valeurs répétées, mais mt_cfvalues ​​peut avoir des enregistrements avec la même valeur, donc maintenant je manque une valeur que je devrais avoir.

SELECT a.link_id, 
      a.link_name, 
      a.link_desc, 
      GROUP_CONCAT(DISTINCT b.value ORDER BY b.cf_ID) AS details, 
      GROUP_CONCAT(DISTINCT c.filename ORDER BY c.ordering) AS images 
FROM  mt_links a 
LEFT JOIN mt_cfvalues b ON a.link_id = b.link_ID 
LEFT JOIN mt_images c ON b.link_id = c.link_ID 
LEFT JOIN mt_cl d ON a.link_id = d.link_ID WHERE d.cat_ID = '1' 
GROUP BY a.link_id 

Je mis en place un SQLFiddle ici: http://www.sqlfiddle.com/#!2/f39e9/1

Y at-il un moyen plus facile? Comment résoudre le problème de répétition/non-répétition?

+0

Qu'est-ce qui est censé se produire lorsque vous rencontrez une valeur répétée? – James

+0

Les valeurs répétées de mt_cfvalues ​​doivent être incluses dans mon résultat. Avis dans mon violon, Link ID 1 ... Dans la colonne Details il aurait fallu retourner "good, no cats, good" – DaveS

Répondre

0

Voici une façon d'accomplir ce que vous cherchez. Étant donné que les deux sous-requêtes renvoient des résultats indépendants, vous ne pouvez pas combiner le GROUP BY, ce qui explique pourquoi vous obteniez des doublons.

SELECT a.link_id, 
      a.link_name, 
      a.link_desc, 
      cvf.details, 
      imgs.images 
FROM  mt_links a 
LEFT JOIN (
    SELECT link_ID, GROUP_CONCAT(value ORDER BY cf_ID) AS details 
    FROM mt_cfvalues 
    GROUP BY link_ID 
) cvf ON cvf.link_ID = a.link_id 
LEFT JOIN (
    SELECT link_ID, GROUP_CONCAT(filename ORDER BY ordering) AS images 
    FROM mt_images 
    GROUP BY link_ID 
) imgs ON imgs.link_ID = a.link_id 
INNER JOIN mt_cl d ON a.link_id = d.link_ID 
WHERE d.cat_ID = '1' 
+0

Merci James. C'est exactement ce dont j'avais besoin – DaveS

Questions connexes