0

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

我在 mysql 数据库中有一个表,我首先想在它应该添加到数据库的日期之前对其进行排序。

SELECT * FROM table ORDER BY date_placed DESC;

接下来日期相同的地方我想通过自动递增的 id 进行排序。所以我添加了:

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

我最终得到这样的结果:

日期_放置 | 身份证 | 标识 | AB
2012 年 5 月 1 日 | 1100 | A50 | 一种
2012 年 5 月 1 日 | 1109 | A50 | 乙
2012 年 5 月 1 日 | 1108 | B40 | 一种
2012 年 5 月 1 日 | 1107 | B40 | 乙
2012 年 4 月 1 日 | 1106 | C30 | 一种
2012 年 4 月 1 日 | 1105 | C30 | 乙

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

日期_放置 | 身份证 | 标识 | AB
2012 年 5 月 1 日 | 1109 | A50 | 乙
2012 年 5 月 1 日 | 1110 | A50 | 一种
2012 年 5 月 1 日 | 1107 | B40 | 乙
2012 年 5 月 1 日 | 1108 | B40 | 一种
2012 年 4 月 1 日 | 1105 | C30 | 乙
2012 年 4 月 1 日 | 1106 | C30 | 一种

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

Quassnoi 的回答是这样的:

日期_放置 | 身份证 | 标识 | AB
2012 年 5 月 1 日 | 1107 | B40 | 乙
2012 年 5 月 1 日 | 1108 | B40 | 一种
2012 年 5 月 1 日 | 1109 | A50 | 乙
2012 年 5 月 1 日 | 1110 | A50 | 一种
2012 年 4 月 1 日 | 1105 | C30 | 乙
2012 年 4 月 1 日 | 1106 | C30 | 一种

身份证件丢失

4

1 回答 1

2
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. id单个内oid是连续的(它们之间没有间隙),并且
  2. B总是Aid顺序走在前面,

用这个:

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

, 没有连接。

于 2012-06-07T13:32:28.117 回答