2012-04-24 97 views
2

根据可能来自多个表的字段值对MySQL中的结果集进行排序的最佳方式是什么?在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()的东西?如果使用一个数组,循环数千行只是为了排序结果会有效吗?

任何帮助,非常感谢。

回答

2

采用三个LEFT JOIN S(学生,家长,教师),并列出每个在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 

从长远来看,我建议改变这个模式,将所有不同类型的名称存储在一张表中,并在表中标识出它是否是学生,老师或家长。

相关问题