2012-04-24 101 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 

從長遠來看,我建議改變這個模式,將所有不同類型的名稱存儲在一張表中,並在表中標識出它是否是學生,老師或家長。

相關問題