2012-02-25 12 views
5

ho tre tabelle vorrei collegare in questa una query.MySQL FULL JOIN una tabella e LEFT JOIN un'altra nella stessa query?

Lo script è un registro di presenza, pertanto registra un segno di presenza per ogni riunione, per utente.

I tre tavoli usati:

"squadra"

:

id | fullname | position   | class | hidden 
1 | Team  | --    | black | 1 
2 | Dan S | Team Manager  | green | 0 
3 | Harry P | Graphic Engineer | blue | 0 

"registro":

id | mid | uid | mark 
1 | 1 | 2 |/
2 | 1 | 3 | I 
3 | 2 | 1 |/
4 | 2 | 3 |/

"incontri":

id | maintask   | starttime | endtime 
1 | Organise Year Ahead | 1330007400 | 1330012800 
2 | Gather Ideas  | 1330612200 | 1330617600 
3 | TODO    | 1331217000 | 1331222400 

v'è un campione dei dati. Quello che voglio fare è:

Selezionare tutti i risultati dal registro, raggrupparli per utente e ordinarli per l'ora di inizio della riunione. Ma, se non c'è un segno nella tabella di registro, lo voglio per visualizzare "-" (può essere fatto tramite PHP, se necessario) Quindi, un risultato atteso in questo modo:

fullname | mark | mid 
Dan S |/ | 1 
Dan S |/ | 2 
Dan S | - | 3 
Harry P | I | 1 
Harry P |/ | 2 
Harry P | - | 3 

My SQL query è questo a il momento:

SELEZIONARE u. fullname, tu. id, r. mark, r. mid DA team u FULL JOIN register r ON r. uid = u. id SINISTRA JOIN meetings m ON r. mid = m. id GRUPPO DI u. id ORDINA DI m. starttime ASC

E ho un errore di ritorno da MySQL:

Hai un errore nella sintassi SQL; controllare il manuale che corrisponde alla versione del server MySQL per la sintassi corretta per utilizzare vicino a FULL JOIN register r ON r. uid = u. id SINISTRA JOIN meetings m ON r. mid = m.`id' at line 1

Ma, non posso vedere un problema con esso: S

Si prega di qualcuno potrebbe dare una mano, mi punto nella giusta direzione o mi danno una possibile soluzione Questo. Molto apprezzato

Dan

Risposta: query che ha funzionato:

SELECT  
     u.fullname, u.id as uid,  
     if(r.uid = u.id, r.mark, '-') as mark,  
     if(r.uid = u.id, r.mid, '-') as mid,  
     r.mid, m.starttime 
    FROM  
     team u 
     CROSS JOIN  
     register r ON u.id = r.uid 
     LEFT OUTER JOIN  
     meetings m ON r.mid = m.id 
    WHERE  
     u.hidden = 0 
    GROUP BY  
     u.id, r.mid 
    ORDER BY  
     m.starttime, u.id ASC 

risposta

4

Full outer join non è supportato da MySQL. Almeno alla versione 5.6, è possibile controllare MySQL Join doc.Un cross join può essere una soluzione alternativa:

CURA

SELECT 
    UxM.fullname, 
    r.mark, 
    UxM.mid, 
    UxM.starttime 
FROM 
    (select u.id as uid, m.id as mid, u.fullname, m.starttime 
    from 
    team u 
     CROSS JOIN 
    meetings) UxM 
    left join 
    register r 
     on UxM.uid = r.uid and UxM.mid = r.mid 
ORDER BY 
    UxM.starttime ASC 

fatemi sapere se questo risolve il problema.


una semplificazione:

SELECT  
    u.fullname, 
    u.id AS uid,  
    COALESCE(r.mark, '-') AS mark,  
    COALESCE(r.mid, '-') AS mid,  
    m.id, 
    m.starttime 
FROM  
    team u 
     CROSS JOIN  
    meetings m 
     LEFT JOIN  
    register r 
     ON r.mid = m.id 
     AND r.id = u.uid 
WHERE  
    u.hidden = 0 
GROUP BY  
    m.id, u.id 
ORDER BY  
    m.starttime, u.id 
+0

Ive usato in MySQL prima di ò.ò Sono sicuro che ho - Forse no, potrebbe essersi confuso con LEFT OUTER JOIN o qualcosa del genere. Cosa posso usare al posto del join esterno completo che farà la stessa cosa? –

+0

Google per 'simulate full outer join mysql' per alcune soluzioni per' FULL OUTER JOIN' che in realtà non esiste in mysql. – biziclop

+0

Grazie mille, CROSS JOIN Ha funzionato perfettamente :) (Per qualche ragione non posso contrassegnare come risposta accettata o.O) –