根据 Quassnoi 的回答,我进行了编辑,以显示使用他的建议会发生什么,并向 OID 添加字母以显示有问题的排序。
我在 mysql 数据库中有一个表,我首先想按应将其添加到数据库的日期对其进行排序。
SELECT * FROM table ORDER BY date_placed DESC;
接下来,如果日期相同,我想通过自动递增的 ID 进行排序。所以我添加了:
SELECT * FROM table ORDER BY date_placed DESC, id DESC;
我最终得到了这样的结果:
Date_Placed | ID | OID | AB 05/01/2012 | 1100 | A50 | A 05/01/2012 | 1109 | A50 | B 05/01/2012 | 1108 | B40 | A 05/01/2012 | 1107 | B40 | B 04/01/2012 | 1106 | C30 | A 04/01/2012 | 1105 | C30 | B
AB 字段将始终仅由 A 或 B 组成,OID 可能存在两次或为唯一值。 我现在想要的是在 OID 重复的情况下,B 位于 AB 列中的 A 之前。请注意,ID 将在一定程度上出现困惑。
Date_Placed | ID | OID | AB 05/01/2012 | 1109 | A50 | B 05/01/2012 | 1110 | A50 | A 05/01/2012 | 1107 | B40 | B 05/01/2012 | 1108 | B40 | A 04/01/2012 | 1105 | C30 | B 04/01/2012 | 1106 | C30 | A
我更喜欢在 mysql 端执行此操作,因为我将检索相当多的行。这可能吗?如果不在 mysql 中,那么我使用 php 那么最好的方法是什么?预先感谢任何可以提供帮助的人。
Quassnoi 的回答是这样的:
Date_Placed | ID | OID | AB 05/01/2012 | 1107 | B40 | B 05/01/2012 | 1108 | B40 | A 05/01/2012 | 1109 | A50 | B 05/01/2012 | 1110 | A50 | A 04/01/2012 | 1105 | C30 | B 04/01/2012 | 1106 | C30 | A
ID订单丢失
最佳答案
SELECT m.*
FROM (
SELECT date_placed, oid, MAX(id) AS mid
FROM mytable
GROUP BY
date_placed, oid
) md
JOIN mytable m
ON (m.date_placed, m.oid) = (md.date_placed, md.oid)
ORDER BY
m.date_placed DESC, mid DESC, ab DESC
如果两个条件成立:
-
单个
id
是连续的(它们之间没有间隙),并且B
按照id
顺序始终位于A
之前,
oid
内的使用这个:
SELECT *
FROM mytable
ORDER BY
date_placed DESC,
CASE ab WHEN 'A' THEN id - 1 ELSE id END DESC,
id
,没有连接。
关于php - 按日期和自动递增列 (id) 排序,但按第四列 (ab) 的字母顺序对第三列 (oid) 具有相同值的行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10932846/