2012-11-23 13 views
7

Ho due tabelle: gemme e gemdetail che sono rimaste unite. Sto provando a limitare il LEFT JOIN a 10 record nella tabella delle gemme. Ci sono altre 2 tabelle unite (gemreply e utenti), ma non contribuiscono al problema. Quanto segue non funziona:Limita a sinistra Partecipa al primo tavolo

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; 

Questo limita il numero totale di righe restituite a 10, ma poiché ci sono più record di dettaglio per ogni gemma, io sono rimasto con meno di 10 record gemma. Ho letto ogni post "LIMIT", ma non ho trovato questa situazione.

UPDATE 1: OK - grazie a jviladrich - ha funzionato. Ecco il codice:

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: Il codice da yogeshr sotto funziona anche - probabilmente quella andrò con. Grazie a tutti e due!

+0

Spostare il limite all'interno della sottoquery? – Ben

+0

Questa versione di MySQL non supporta ancora "LIMIT e IN/TUTTI/QUALSIASI/QUALCHE sottochera" è ciò che accade all'interno di una query secondaria. – mseifert

+0

Ok, quindi vuoi il record delle prime 10 gemme e tutti i loro dettagli e poi unisciti a LEFT-join con gemreply e utenti? – Rachcha

risposta

6

Qualcosa del genere

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

Prova questo:

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; 

Questo dovrebbe funzionare.

+0

Anche questo funziona! Probabilmente andrò con questo - mi legge meglio. Vorrei poter contrassegnare entrambi i messaggi come risposta (controllato). – mseifert

+0

È semplice - accetta la risposta che è stata la più utile per te :) – Rachcha