2012-04-24 16 views
2

複数のテーブルから来る可能性のあるフィールド値に基づいてMySQLで結果セットをソートする最良の方法は何ですか?MySQLの複数のテーブルからデータをソートする最も良い方法

簡略化のため、DBに4つのテーブルがあるとします。プライマリテーブルには多数のフィールドが含まれていますが、特に、別のテーブルの名前とそのテーブルのレコードへの外部キーを含む列が含まれています。 3つの外部テーブルにはそれぞれ、プライマリテーブルで結果を並べ替えるための名前列があります。

Example primary table: 

+----+---------------+------------+-------------+ 
| id | foreign_table | foreign_id | more_fields | 
+----+---------------+------------+-------------+ 
| 1 | students  |  9182 | blah, blah | 
| 2 | students  |  1008 | blah, blah | 
| 3 | parents  |  3827 | blah, blah | 
| 4 | teachers  |  4523 | blah, blah | 
| 5 | teachers  |  1092 | blah, blah | 
+----+---------------+------------+-------------+ 

Example foreign (students) table: 

+-------+--------------+-------------+ 
| id | name   | more_fields | 
+-------+--------------+-------------+ 
| 9182 | Joe   | blah, blah | 
| 1008 | Sally  | blah, blah | 
+-------+--------------+-------------+ 

これはMySQLで可能ですか?または、PHPで結果をループして並べ替える配列を作成し、array_multisort()のようなものを使用する必要がありますか?配列を使用する場合は、結果をソートするだけで何千もの行をループするのが効率的でしょうか?

ご協力いただきまして誠にありがとうございます。 3つのLEFT JOIN S(生徒、保護者、教師)とORDER BYにそれぞれをリストは、あなたが一緒に他の3つのテーブルから名前をCOALESCE()場合は仕事をするべき使用

答えて

2

:長期的に

SELECT 
    primary_table.*, 
    COALESCE(students.name, parents.name, teachers.name) AS name 
FROM 
    primary_table 
    LEFT JOIN students ON (foreign_table = 'students' AND foreign_id = students.id) 
    LEFT JOIN parents ON (foreign_table = 'parents' AND foreign_id = parents.id) 
    LEFT JOIN teachers ON (foreign_table = 'teachers' AND foreign_id = teachers.id) 
ORDER BY name 

を、このスキーマを変更して、1つのテーブルに異なるタイプの名前をすべて格納し、そのテーブルに識別子が学生、教師、または親のいずれであるかを示しておくことをお勧めします。

関連する問題