2009-10-15 11 views
2

Ma requête:MySQL LIMIT LEFT JOIN

SELECT issues.*, 
      comments.author AS commentauthor, 
      comments.when_posted AS commentposted 
    FROM issues 
LEFT JOIN (SELECT * 
      FROM comments 
     ORDER BY when_posted DESC 
      LIMIT 1) AS comments ON issues.id=comments.issue 
ORDER BY IFNULL(commentposted, issues.when_opened) DESC 

Mon problème est le "LIMIT 1" sur la troisième ligne. Cela limite tous les commentaires au plus récent, ainsi seuls les problèmes avec le commentaire le plus récent seront rapportés comme ayant un commentaire.

Si je supprimais la partie "LIMIT 1" à partir de là, j'obtiendrais une ligne pour chaque commentaire d'un problème, et ce n'est pas ce que je veux. Ce que je veux, c'est seulement le commentaire le plus récent pour chaque numéro.

Dans tous les cas, je ne suis pas sûr que ma partie IFNULL fonctionne même parce que ce n'est pas ce que je suis en train de faire pour le débogage.

Alors, comment pourrais-je réaliser ce que je voulais?

+0

rexem - Votre modification à mon code SQL. .. l'espacement gauche semble étrange: c – unrelativity

+0

Vous voulez dire l'alignement? –

+0

De toute façon c'est beaucoup mieux qu'avant. –

Répondre

2
SELECT issues.*, 
      comments.author AS commentauthor, 
      comments.when_posted AS commentposted 
    FROM issues 
LEFT JOIN (SELECT c1.issue, c1.author, c1.when_posted 
       FROM comments c1 
      JOIN 
      (SELECT c2.issue, max(c2.when_posted) AS max_when_posted   
       FROM comments c2 
      GROUP BY issue) c3 
      on c1.issue = c3.issue and c1.when_posted = c3.max_when_posted 
     ) AS comments ON issues.id=comments.issue 
ORDER BY COALESCE(commentposted, issues.when_opened) DESC 
+0

Attention: mysql_fetch_array(): l'argument fourni n'est pas une ressource de résultat MySQL valide. Oh cher. – unrelativity

+0

Avez-vous testé la requête directement dans 'MySql' (au moins pour avoir le message d'erreur sql s'il y en a un). Cette erreur «php» peut signifier beaucoup de choses. – manji

+0

phpMyAdmin dit "# 1052 - Column 'issue' dans la liste des champs est ambigu" – unrelativity

3

Essayez:

SELECT i.*, 
      c.author AS commentauthor, 
      c.when_posted AS commentposted 
    FROM ISSUES i 
LEFT JOIN COMMENTS c ON c.issue = i.id 
    JOIN (SELECT c.issue, 
        MAX(c.when_posted) 'max_when_posted' 
      FROM COMMENTS c 
     GROUP BY c.issue) mwp ON mwp.issue = c.issue 
           AND mwp.max_when_posted = c.when_posted 
ORDER BY COALESCE(c.when_posted, i.when_opened) DESC 
+0

Cela fonctionne, mais j'ai un problème dans ma base de données sans aucun commentaire associé, et il n'est pas répertorié. En tout cas, toutes ces réponses sont quelque peu ... confuses. J'ai beaucoup à apprendre .... – unrelativity

0

Modifier

Depuis MySql n'a pas CTE après tout, essayez ceci:

SELECT i.* 
    c.author AS CommentAuthor, 
    c.when_posted AS CommentPosted 
FROM Issues i 
LEFT JOIN 
    (SELECT issue, MAX(when_posted) AS LastPostDate 
    FROM comments GROUP BY issue) ic ON ic.issue = i.id 
LEFT JOIN Comment c ON c.issue = i.id AND c.when_posted = ic.LastPostDate 
ORDER BY COALESCE(ic.LastPostDate, issues.when_opened) DESC 
+0

Malheureusement, ce n'est pas le cas: P – unrelativity

+0

Malheureusement, MySQL ne supporte pas la clause WITH. La demande a été dans depuis 2006 :( –

Questions connexes