按日期排序并自动递增列 (id),但按第四列 (ab) 的字母顺序对具有相同值的行进行排序


Order by date and auto increment column (id), but order rows with same value for third column (oid) alphabetically by fourth column (ab)

根据Quassnoi的回答,我编辑了使用他的建议来显示会发生什么,并在OID中添加了字母以显示有问题的排序。

我在 mysql 数据库中有一个表,我首先想按它应该添加到数据库中的日期排序。

SELECT * FROM table ORDER BY date_placed DESC;

下一个日期相同的地方,我想按自动递增的 id 订购。所以我补充了:

SELECT * FROM table ORDER BY date_placed DESC, id DESC;

我最终得到这样的东西:

Date_Placed | 身份证 | oid | 血型2012/1/5 |1100 | A50 | 一个2012/1/5 |1109 | A50 | B2012/1/5 |1108 | B40 | 一个2012/1/5 |1107 | B40 | B2012/04/01 |1106 | C30 | 一个2012/04/01 |1105 | C30 | B

AB 字段将始终仅由 A 或 B 组成,OID 可以存在两次,也可以是唯一值。我现在想要的是,在 OID 重复的情况下,B 在 AB 列中出现在 A 之前。请注意,ID 将在一定程度上乱序。

Date_Placed | 身份证 | oid | 血型2012/1/5 |1109 | A50 | B2012/1/5 |1110 | A50 | 一个2012/1/5 |1107 | B40 | B2012/1/5 |1108 | B40 | 一个2012/04/01 |1105 | C30 | B2012/04/01 |1106 | C30 | 一个

我更喜欢在 mysql 方面执行此操作,因为我将检索相当多的行。这可能吗?如果不是在mysql中,那么我正在使用php,那么最好的方法是什么?提前感谢任何可以提供帮助的人。

夸斯诺伊的回答是这样的:

Date_Placed | 身份证 | oid | 血型2012/1/5 |1107 | B40 | B2012/1/5 |1108 | B40 | 一个2012/1/5 |1109 | A50 | B2012/1/5 |1110 | A50 | 一个2012/04/01 |1105 | C30 | B2012/04/01 |1106 | C30 | 一个

身份证件订单丢失

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

如果两个条件成立:

  1. 单个oid内的id是连续的(它们之间没有间隙),并且
  2. B总是按id顺序排在A之前,

使用这个:

SELECT  *
FROM    mytable
ORDER BY
        date_placed DESC,
        CASE ab WHEN 'A' THEN id - 1 ELSE id END DESC,
        id

,没有联接。