1

私は3つのテーブルを持っています

students: first_name, last_name, high_school_id, other_high_school

high_schols: id, title

other_high_schools: id, title, student_id

各生徒のリストを次の情報とともに表示したい:名、姓、高校

high_schoolsテーブルには、生徒が選択できる高校のリストが事前に入力されています。高校が見つからない場合は、[その他の高校]フィールドに高校を入力します。生徒がフォームを送信すると、情報が保存され、students.other_high_schoolフィールドが1に設定され、高校のタイトルとともにID(student.id = other_high_school.student_id)がother_high_schoolsテーブル(other_high_school.title)に保存されます。

select 
 first_name, last_name, hs.title as high_school
from
 students s
left join
 high_schools hs
on
 s.high_school_id = hs.id

これはfirst_name、last_name、high_schoolを返しますが、そのクエリを変更して、students.other_high_school = 1かどうかを検出し、high_schoolsテーブルではなくother_high_schoolに参加することはできますか?

これは機能しませんが、私が達成しようとしていることを説明するのに役立つはずです。

select 
 first_name, last_name, hs.title as high_school
from
 students s

CASE s.other_high_school
 WHEN 0 THEN
  left join
   high_schools hs
  on
   s.high_school_id = hs.id
 WHEN 1 THEN
  left join
   other_high_school hs
  ON
   s.id = hs.student_id
 ELSE
  left join
   other_high_school hs
  ON
   s.id = hs.student_id
END CASE

解決済み

select 
 first_name, last_name, 
 IF(s.other_high_school = 1, ohs.title, hs.title) high_school
from
 students s
left join
 high_schools hs
on
 s.high_school_id = hs.id
left join
 other_high_schools ohs
on
 s.id = ohs.student_id
4

1 に答える 1

1

まず、あなたのスキーマを再考します。本当に異なるテーブルにhigh_schoolsとother_high_schoolsが必要ですか?または、それがデフォルトの高校であるか、ユーザーが追加した高校であるかについて、追加のフラグが付いた1つのテーブルを作成できますか?

第二に、3つのテーブルすべてで左に参加しているため、ソリューションの拡張性があまり高くないように感じます。テーブルが大きくなるにつれて、パフォーマンスが急速に低下すると思います。私は別の方法を提案します:

SELECT first_name, last_name,title
FROM (
SELECT first_name, last_name,title
FROM students s
    INNER JOIN high_schools hs ON s.high_school_id = hs.id
WHERE s.other_high_school=0
UNION
SELECT first_name, last_name,title
FROM students s
    INNER JOIN other_high_schools ohs ON s.high_school_id = ohs.id
WHERE s.other_high_school=1
) AS combined_schools
ORDER BY last_name,first_name

適切なINDEXを使用すると、これはソリューションと同じくらい速く、おそらくより適切にスケーリングするはずです(ただし、これはすべて実際のデータセットの形状に依存します)。結合された結果を操作する方法を示すために、ORDERBYを追加しました。

于 2012-04-15T12:41:46.017 に答える