按日期排序和自动增量列(id),但按第四列(ab)的字母顺序排列第三列(oid)具有相同值的行

时间:2012-06-07 13:30:25

标签: php mysql sql-order-by

根据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订单丢失

1 个答案:

答案 0 :(得分: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

如果有两个条件:

    单个id内的
  1. oid是连续的(它们之间没有间隙),
  2. B总是在A订单{/ 1}}之前,
  3. 使用它:

    id

    ,没有加入。