2011-01-26 12 views
5

"Tablo" dediğim bir tablo, Sınıflar ve başka bir tablo var - yani, belirli bir yerdeki belirli bir kişi tarafından öğretilen bir sınıfın örnekleri. Temel olarak hangi derslerin belirli ders parametrelerine göre aktif olduğunu gösteren bir tablo çekmek istiyorum. Örneğin:MySQL'de bir tablonun her satırı için yalnızca bir eşleme ile iki tabloya katılabilir miyim?

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

Sadece her sınıf yalnızca bir örneğini döndürmek için SELECT classes.* FROM classes JOIN courses ON classes.class_id=courses.class_id WHERE courses.room=1 gibi bir şey alabilirsiniz bir yolu olup olmadığını merak ediyorum. Neler oluyor, sadece oda 1'de yer alan sınıfları alıyorum, ancak her birinin birden fazla örneğini alıyorum çünkü 1. sınıftaki ders tablosunda birden fazla örnek var.

JOIN - sol, sağ, iç, vb. farklı her türlü denedi - ve bir tablonun diğerinden aldığı özellikleri temel alarak çekiyorum çünkü hepsi aynı sonucu veriyor.

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

Ama sadece almak istiyorum:

yüzden alıyorum

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

Ben Sınıflar her satır için ilk maç sadece JOIN o olabilir mi? MySQL ile yeni biriyim, bu yüzden açıkça yapmak istediklerimi ifade etmekte biraz sorun yaşıyorum; Özür dilerim.

Ayrıca: Tüm bunları PDO aracılığıyla PHP'ye yüklüyorum - belki bunu PDO içinde başarmanın belirli bir yolu var mı? sorguda ORDER BY madde değiştirerek

+1

DERSLER tablosundan sadece bir kayıt istiyorsan, hangisini istiyorsun? IE: Her zaman en düşük kursiyer (& oda?) Değeri? –

+0

Bu kesinlikle önemli değil. Haklısın, bunu belirtmeliydim. Ben sadece CLASSES verilerine gidiyorum; DERSİN için gideceğim tek neden, sadece doğru kritere sahip ilgili dersleri olan Sınıfları almaktır. –

cevap

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 

GRUP agrega sonuçlarına izin verir döndürülür sınıfların tanımlıyabilirsiniz (bu örnekte) bu yüzden, belirli alanlarda o (classes.class_id, classes.name, courses.room) daha fazla detay için

sadece eşsiz demet alacak http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

+0

Ders sütunlarını seçmemek, çıktının kopyalanmayacağı anlamına gelmez. –

+0

@OMG Ponies ama "group by" – Ass3mbler

+0

ekleyeceğim GROUP BY kısıtlaması ekledim, soru sorgusuyla ilgili herhangi bir veri seçmiyor – 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 
     ) 

, sen (ya da en azından büyük olan id vb olduğu)

+1

Bu işe yarıyor gibi görünüyor, ancak yürütmek için phpMyAdmin 76 saniye sürdü. Buna neden olabilecek bir fikrin var mı? –

+0

@Ben: "courses (class_id, room, id)" dizinlerinde bir dizin oluşturun ' – Quassnoi

İlgili konular