2011-01-26 11 views
5

私はクラス「クラス」と「コース」と呼ばれるテーブルを持っています。つまり、特定の人が特定の場所で教えるクラスのインスタンスです。基本的には、特定のコースのパラメーターに基づいてどのクラスがアクティブであるかを私に見せてくれるテーブルを取りたいです。たとえば、次のようにMySQLで1つのテーブルの各行に対して1つの一致を持つ2つのテーブルを結合できますか?

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

私はちょうど、各クラスのインスタンスを1つだけ返すようにSELECT classes.* FROM classes JOIN courses ON classes.class_id=courses.class_id WHERE courses.room=1のようなものを得ることができる方法があります場合、私は思ったんだけど。私は部屋1で行われるクラスだけを取得していますが、部屋1のコーステーブルにそのクラスのインスタンスが複数存在するため、それぞれ複数のインスタンスが取得されています。

JOIN - 左、右、内側など - いろいろな種類のものを試してみました。そして、私が他のテーブルの仕様に基づいてテーブルを引っ張っているので、それらはすべて私に同じ結果を与えるようです。

だから私は取得しています:

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

をしかし、私はちょうど取得したい:

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

は私だけJOINクラスの各行の最初の試合でそれを持つことができますか?私はMySQLで新しくなっているので、私が明確にしたいことを表現するのに少し問題があります。謝罪します。

また、私はPDO経由でこれをすべてPHPに取り込みます - PDOでこれを達成する具体的な方法がありますか?

+1

COURSESテーブルから1つのレコードのみが必要な場合は、どちらのレコードを使用しますか? IE:常に最低のcourseid(&room?)の値ですか? –

+0

正直なところ重要ではありません。あなたは正しいと言いました。私はクラスデータを取得するだけです。私がコースに行く唯一の理由は、適切な基準を持つ対応するコースを持つクラスだけを取得することです。 –

答えて

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あなたが結果を集約することができ(id等最小または最大を有するがこと)返されるクラスを定義することができ(この例では)指定されたフィールド上で(classes.class_id、classes.name、courses.room)のユニークなタプルをとります。

http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

+0

コースの列を選択しても、出力が重複しないことはありません。 –

+0

@OMGポニーだが「グループ」は – Ass3mbler

+0

GROUP BY制約を追加しました。質問に関するクエリはコースに関するデータを選択しません – 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 
     ) 

サブクエリでORDER BY句を変更することにより、あなたは

+1

これはうまくいくようですが、phpMyAdminの実行に76秒かかりました。何が原因だろうか? –

+0

@Ben:コース(class_id、room、id)にインデックスを作成する – Quassnoi

関連する問題