2012-11-23 7 views
7

Ich habe zwei Tabellen: Gems und Gemdetail, die links sind verbunden. Ich versuche den LEFT JOIN auf 10 Datensätze in der Gems-Tabelle zu beschränken. Es gibt zwei weitere Tabellen (gemreply und Benutzer), aber sie tragen nicht zum Problem bei. Die folgende funktioniert nicht:Begrenzen Sie eine linke Join auf der ersten Tabelle

SELECT gems.gemid, gems.title, r.tot, gemdetail.filename FROM ((gems 
LEFT JOIN (SELECT gemid, COUNT(*) AS tot FROM gemreply GROUP BY gemid) AS r ON gems.gemid = r.gemid) 
LEFT JOIN gemdetail ON gems.gemid = gemdetail.gemid) 
LEFT JOIN users ON gems.userid = users.userid 
WHERE gems.grade = '7' ORDER BY gems.gemid LIMIT 0, 10; 

Dies begrenzt die Gesamtzahl der zurückgegebenen Zeilen zu 10, aber da gibt es mehrere Detaildatensätze für jeden Edelstein sind, bin ich mit weniger als 10 gem Aufzeichnungen links. Ich habe jeden "LIMIT" -Posten gelesen, aber diese Situation nicht gefunden.

UPDATE 1: OK - dank jviladrich - es hat funktioniert. Hier ist der Code:

SELECT gems.gemid, gems.title, r.tot, gemdetail.filename 
FROM ((gems 
INNER JOIN (SELECT gems.gemid from gems WHERE gems.grade = '7' ORDER BY gems.gemid LIMIT 0, 10) g 
ON (gems.gemid = g.gemid) 
LEFT JOIN (SELECT gemid, COUNT(*) AS tot FROM gemreply GROUP BY gemid) AS r ON gems.gemid = r.gemid) 
LEFT JOIN gemdetail ON gems.gemid = gemdetail.gemid) 
LEFT JOIN users ON gems.userid = users.userid ; 

UPDATE 2: Der Code von yogeshr unten funktioniert auch - wahrscheinlich diejenige, die ich mit gehen werde. Danke euch beiden!

+0

Verschieben Sie das Limit innerhalb der Unterabfrage? – Ben

+0

Diese Version von MySQL unterstützt "LIMIT & IN/ALL/ANY/SOME-Unterabfrage" noch nicht, was in einer Unterabfrage geschieht. – mseifert

+0

Ok, willst du also die ersten 10 Edelsteine ​​und alle ihre Details aufnehmen und dann mit GEMEPRLY und Usern beitreten oder LINKEN? – Rachcha

Antwort

6

etwas wie die

SELECT * FROM A 
     INNER JOIN (SELECT * FROM A WHERE A.FIELD1='X' ORDER BY A.FIELD2 LIMIT 10) X 
      ON (A.KEYFIELD=X.KEYFIELD) 
     LEFT JOIN B ON (A.FIELD = B.FIELD) 
     LEFT JOIN C ON (A.FIELD = C.FIELD) 
4

Try this:

SELECT g.gemid, g.title, r.tot, gemdetail.filename 
FROM (SELECT * FROM gems WHERE grade = '7' LIMIT 10) g 
LEFT JOIN (SELECT gemid, COUNT(*) AS tot FROM gemreply GROUP BY gemid) r 
      ON r.gemid = g.gemid 
LEFT JOIN gemdetail ON g.gemid = gemdetail.gemid 
LEFT JOIN users ON g.userid = users.userid 
ORDER BY g.gemid; 

Diese funktionieren soll.

+0

Das funktioniert auch! Ich werde wahrscheinlich mit diesem gehen - es liest sich besser für mich. Ich wünschte, ich könnte beide Beiträge als Antwort markieren (geprüft). – mseifert

+0

Es ist einfach - akzeptiere die Antwort, die für dich am nützlichsten war :) – Rachcha

Verwandte Themen