2010-06-15 21 views
1

cartésienne Au moment où je peux obtenir les résultats dont j'ai besoin de deux déclarations séparées SELECTmultiples many-to-many JOIN dans une seule requête mysql sans produit

SELECT 
COUNT(rl.refBiblioID) 
FROM biblioList bl 
LEFT JOIN refList rl ON bl.biblioID = rl.biblioID 
GROUP BY bl.biblioID 

SELECT 
GROUP_CONCAT(
CONCAT_WS(':', al.lastName, al.firstName) 
ORDER BY al.authorID) 
FROM biblioList bl 
LEFT JOIN biblio_author ba ON ba.biblioID = bl.biblioID 
JOIN authorList al ON al.authorID = ba.authorID 
GROUP BY bl.biblioID 

Combinant eux comme cela, cependant

SELECT 
GROUP_CONCAT(
CONCAT_WS(':', al.lastName, al.firstName) 
ORDER BY al.authorID), 
COUNT(rl.refBiblioID) 
FROM biblioList bl 
LEFT JOIN biblio_author ba ON ba.biblioID = bl.biblioID 
JOIN authorList al ON al.authorID = ba.authorID 
LEFT JOIN refList rl ON bl.biblioID = rl.biblioID 
GROUP BY bl.biblioID 

provoque la colonne résultat de l'auteur à avoir des noms en double. Comment puis-je obtenir les résultats souhaités d'une instruction SELECT sans utiliser DISTINCT? Avec des sous-requêtes?

Répondre

1

Si les sous-requêtes sont acceptables, je crois que vous pourriez y arriver en faisant quelque chose comme ceci:

SELECT 
    y.authors, 
    COUNT(rl.refBiblioID) 
FROM 
    (SELECT 
    bl.biblioId, 
    GROUP_CONCAT(
     CONCAT_WS(':', al.lastName, al.firstName) 
     ORDER BY al.authorID) AS authors 
    FROM biblioList bl 
    LEFT JOIN biblio_author ba ON ba.biblioID = bl.biblioID 
    JOIN authorList al ON al.authorID = ba.authorID 
    GROUP BY bl.biblioID) y 
LEFT JOIN refList rl ON (y.biblioID = rl.biblioID) 
GROUP BY y.biblioID 

Une autre solution serait d'ajouter à votre DISTINCTGROUP_CONCAT, mais ce n'était pas ce que vous vouliez?

GROUP_CONCAT(
    DISTINCT(CONCAT_WS(':', al.lastName, al.firstName) ORDER BY al.authorID)),