2

複数のテーブルから得られる可能性のあるフィールド値に基づいて、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() のようなものを使用する必要がありますか? 配列を使用する場合、結果をソートするためだけに何千もの行をループするのは効率的ですか?

どんな助けでも大歓迎です。

4

1 に答える 1

2

3 つLEFT JOINの s (学生、保護者、教師) を使用し、それぞれを にリストすることで、他の 3 つのテーブルの名前を一緒に使用するORDER BYことができます。COALESCE()

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 つのテーブルに格納し、そのテーブルに生徒、教師、親のいずれであるかを示す識別子を付けることをお勧めします。

于 2012-04-24T01:58:17.210 に答える