2011-01-26 17 views
5

Tengo una tabla, Clases y otra tabla que llamo "cursos", es decir, ejemplos de una clase impartida por una persona específica en un lugar específico. Quiero sacar una tabla que básicamente me muestra qué clases están activas en función de ciertos parámetros del curso. Por ejemplo:¿PUEDO UNIRME dos tablas con una sola coincidencia para cada fila de una tabla en MySQL?

 
CLASSES 
class_id|class_name 
--------|------------ 
     1|Class One 
     2|Class Two 
     3|Different Class 
etc... 

COURSES 
course_id|class_id|room 
---------|--------|-------- 
     1|  3|  1 
     2|  3|  2 
     3|  1|  1 
     4|  3|  1 
     5|  3|  2 
     6|  2|  1 
etc... 

Me pregunto si hay una manera que sólo puede conseguir algo como SELECT classes.* FROM classes JOIN courses ON classes.class_id=courses.class_id WHERE courses.room=1 para devolver sólo una instancia de cada clase. Lo que sucede es que obtengo solo las clases que tienen lugar en la sala 1, pero obtengo varias instancias de cada una porque hay varias instancias de esa clase en la tabla de cursos en la sala 1.

Tengo intenté todos los tipos diferentes de JOIN - izquierda, derecha, interior, etc. - y porque estoy tirando de una tabla según las especificaciones de la otra, todos parecen darme el mismo resultado.

Así que estoy recibiendo:

 
class_id| class_name |course_id|room 
--------|--------------|---------|-------- 
     1|Class One  |  3|  1 
     2|Class Two  |  6|  1 
     3|Diferent Class|  1|  1 
     3|Diferent Class|  4|  1 
etc... 

Pero quiero acaba de obtener:

 
class_id| class_name |course_id|room 
--------|--------------|---------|-------- 
     1|Class One  |  3|  1 
     2|Class Two  |  6|  1 
     3|Diferent Class|  1|  1 
etc... 

¿Puedo tener sólo JOIN en el primer partido para cada fila de clases? Soy algo nuevo con MySQL, así que estoy teniendo problemas para expresar claramente lo que quiero hacer; Me disculpo.

También: Estoy sacando todo esto en PHP a través de PDO - ¿hay alguna forma específica de lograr esto en PDO?

+1

Si solo desea un registro de la tabla CURSOS, ¿cuál de ellos desea? IE: ¿Siempre el valor más bajo de courseid (y room?)? –

+0

Honestamente, no importa. Tienes razón, debería haber dicho eso. Solo voy por los datos de CLASES; la única razón por la que voy a CURSO es obtener solo aquellas clases que tienen los cursos correspondientes con los criterios correctos. –

Respuesta

8
SELECT 
    classes.class_id, 
    classes.name, 
    courses.room 
FROM classes 
    JOIN courses 
     ON classes.class_id=courses.class_id 
WHERE courses.room=1 
GROUP BY classes.class_id,classes.name,courses.room 

GROUP BY que permite a los resultados agregados en los campos especificados, por lo que (en este caso) porque va a ser la única de tupla (classes.class_id, classes.name, courses.room)

para más detalles http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

+0

No SELECCIONAR las columnas de cursos no significa que la salida no se duplicará. –

+0

@OMG Ponies pero el "grupo por" – Ass3mbler

+0

he agregado una restricción GROUP BY, la consulta sobre la pregunta no selecciona ningún dato sobre los cursos – Dalen

2
SELECT cl.class_id, cl.class_name, c.course_id, c.room 
FROM classes cl 
JOIN courses c 
ON  c.course_id = 
     (
     SELECT ci.course_id 
     FROM courses ci 
     WHERE ci.class_id = cl.class_id 
       AND ci.room = 1 
     ORDER BY 
       ci.class_id, ci.course_id -- or whatever 
     LIMIT 1 
     ) 

Al cambiar la cláusula ORDER BY en la subconsulta, se puede definir cuál de las clases será devuelto (que con el menor o mayor id etc)

+1

Esto parece funcionar, pero phpMyAdmin tardó 76 segundos en ejecutarse. ¿Alguna idea de lo que podría estar causando eso? –

+0

@Ben: crea un índice en 'courses (class_id, room, id)' – Quassnoi

Cuestiones relacionadas