2012-02-25 18 views
5

tengo tres tablas que me gustaría vincular en esta consulta.MySQL FULL JOIN en una tabla, y LEFT JOIN en otra en la misma consulta?

El script es un registro de asistencia, por lo que registra una marca de asistencia para cada reunión, por usuario.

Las tres tablas utilizadas:

"equipo"

:

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 |/

"reuniones":

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

Hay una muestra de los datos. Lo que quiero hacer es:

Seleccione todos los resultados del registro, agrúpelos por el usuario y ordénelos antes de la hora de inicio de la reunión. Pero, si no hay una marca en la tabla de registro, yo quiero que aparezca "-" (que se puede hacer a través de php si es necesario) Así que un resultado esperado de este modo:

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

Mi consulta SQL es esto en el momento:

SELECCIONAR u. fullname, u. id, r. mark, r. mid DESDE team u UNIRSE POR COMPLETO register r ON r. uid = u. id UNIRSE A LA IZDA meetings m EN r. mid = m. id GROUP BY u. id PEDIDO POR m. starttime ASC

y me sale un error de vuelta de MySQL:

Usted tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de 'FULL JOIN register r ON r. uid = u. id IZQUIERDA UNIRSE meetings m ON r. mid = m.`id' at line 1

Pero, no puedo ver un problema con él: S

Por favor, alguien podría ayudar, me punto en la dirección correcta o me da una posible solución a esta. Muy apreciado

Dan

Respuesta: Consulta que trabajaba:

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 

Respuesta

4

Full outer join no está soportada por MySQL. Al menos para la versión 5.6, puede marcar MySQL Join doc.Un cross join puede haber una solución:

EDITADO

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 

Vamos a saber si esto soluciona el problema.


Una simplificación:

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 lo utilizó en MySQL antes O.o Estoy seguro de que tengo - Tal vez no, puede ser que tenga confunde con LEFT OUTER JOIN o algo así. ¿Qué puedo usar en lugar de la combinación externa completa que hará lo mismo? –

+0

Google para 'simular la combinación externa completa mysql' para algunas soluciones para' FULL OUTER JOIN' que de hecho no existe en mysql. – biziclop

+0

Muchas gracias, CROSS JOIN funcionó a la perfección :) (Por alguna razón no puedo marcar como respuesta aceptada o.O) –