从MySQL中的多个表中排序数据的最佳方法

时间:2012-04-24 01:45:28

标签: php mysql sql database sorting

根据可能来自多个表的字段值对MySQL中的结果集进行排序的最佳方法是什么?

为简单起见,假设DB中有四个表。主表包含许多字段,但特别是它包含一个列,该列具有另一个表的名称和该表中记录的外键。三个外表中的每一个都包含一个名称列,我想在主表中对结果进行排序。

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()这样的东西?如果使用数组,为了对结果进行排序,循环数千行是否有效?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

使用三个LEFT JOIN(学生,家长,老师)并在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 其他三个表中的名字一起工作:< / p>

{{1}}

从长远来看,我建议更改此架构,将所有不同类型的名称存储在一个表中,该表中的标识符表示它是学生,教师还是父母。