php - 在 MySQL 中对多个表中的数据进行排序的最佳方法

标签 php mysql sql database sorting

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

为了简单起见,假设数据库中有四个表。主表包含许多字段,但特别是它包含一个带有另一个表名称的列以及该表中记录的外键。三个外部表中的每一个都包含一个名称列,我希望在主表中对结果进行排序。

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

非常感谢任何帮助。

最佳答案

使用三个 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 

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

关于php - 在 MySQL 中对多个表中的数据进行排序的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10290727/

相关文章:

PHP for 不循环所有值

php 日期重新格式化

mysql - 数据库连接字符串和排序规则

php - 下拉值未循环插入数据库

.net - 最快的 .Net 和 SQL 数据类型

php - 如何在 Sublime Text 2 中自动检查代码(PHP、Python、HTML、Javascript)中的错误?

php - Node.JS 上的 WooCommerce WebHook 签名匹配问题

java - 基于 BIRT 中的另一个表更改表值

mysql - 在 Sql 中对数据进行分组

sql - 当未指定 'Order by' 时,查询会为您的记录集选择什么顺序?