【发布时间】:2021-10-26 04:46:36
【问题描述】:
基本上我想按“标题”排序,同时在该顺序中将具有相同、非空“series_id”的电影分组在一起。 series_id 为 NULL 的标题应仅按标题排序,而非 NULL series_ids 应按“series_order”排序,并根据原始列中的“series”.“title”排序。我宁愿在查询中实现这一点,而不是加载整个数据库并从那里进行排序。
我尝试过的(MySQL 5.7.17):
按标题排序,series_id
SELECT * FROM media
ORDER BY title, series_id, series_order
LIMIT 0, 30
不考虑字母顺序不同的系列中的标题(参见下面的示例)。
ORDER BY CASE 使用 CONCAT 按 'series'.'title' + 'media'.'series_order' 排序
SELECT * FROM media
ORDER BY CASE
WHEN series_id IS NULL THEN title
ELSE CONCAT((SELECT title FROM series WHERE id = media.series_id), series_order)
END
LIMIT 0, 30
结果在 SQL Fiddle 中正确排序,但在开发服务器上没有。公平地说,这仍然不是预期的结果,因为“系列”。“标题”可能与原始电影标题不同。
LEFT JOIN 包含“系列”表以使用相同的想法进行排序
SELECT media.*, series.title, series.id FROM media
LEFT JOIN series ON media.series_id = series.id
LIMIT 0, 30
这也不能正确地对数据进行排序。
样本数据:
| title | series_id | series_order |
|---|---|---|
| 88 Minutes | NULL | NULL |
| Live Free or Die Hard | 100094 | 4 |
| 3rd Rock from the Sun | 100000 | 2 |
| 2 Guns | NULL | NULL |
| Die Hard | 100094 | 1 |
| Evil Dead | NULL | NULL |
| A Good Day to Die Hard | 100094 | 5 |
| 3rd Rock from the Sun | 100000 | 1 |
| Desired Result | Order |
|---|---|
| 2 Guns | NULL |
| 3rd Rock from the Sun | 1 |
| 3rd Rock from the Sun | 2 |
| 88 Minutes | NULL |
| Die Hard | 1 |
| Live Free or Die Hard | 4 |
| A Good Day to Die Hard | 5 |
| Evil Dead | NULL |
主表:媒体 相关列:title、series_id、series_order
系列表:系列 相关列:id、title
小提琴:http://sqlfiddle.com/#!9/efca7c/3
在小提琴上,选项 2 似乎有效。在开发版本中,它只对部分内容进行排序。
编辑:事实证明,在将数据转换为 JSON 之前,我用来存储数据的 PHP 代码不可避免地会按主 ID 重新排序结果。
【问题讨论】:
-
您的
media表缺少id列。是主键吗? -
所以您实际上是在查看 Web 界面排序而不是查询结果?如果我没记错的话,您在查询中的顺序不一定会在 Web 界面上复制……这是两种不同的顺序。后面运行的查询应该已经 limit 基于放置的过滤器的结果,我很确定它不会加载整个数据库。那你应该试着从网络界面弄清楚排序,对吧?
-
@FaNo_FN Web 界面正在执行 AJAX 请求,然后以 JSON 格式返回。订单没有被界面修改,因为我还没有在界面中写入任何订单。
-
所以,假设我们像以前一样使用一小组数据,那么您已经设法在查询中正确获取订单,但是当它转换到 Web 界面时,订单发生了变化。我假设最终的 JSON 值被检索到网络中是根据 JSON 中的排序,对吗?我想您将能够看到从 MySQL 查询到 JSON 的转换是否保留相同的顺序。抱歉,我真的不熟悉 AJAX 或 JSON,但这似乎不是 MySQL 查询问题。
-
@FaNo_FN 顺便说一句,你在标记上。虽然问题不是 AJAX 或 JSON,但我将信息存储在 PHP 变量中的方式是按主 ID 自动对其进行排序。仅当根据我的搜索参数删除结果时,结果才会波动。我点赞了您的 cmets,因为它们与寻找解决方案有关。谢谢!