按时间排序,时间在不同列的同一表中

时间:2013-11-16 06:59:04

标签: php sql

嗨我为“通知”制作了一个表格,例如,这里有不同问题的不同问题的时间(这不是所有的值,但我认为这足以理解我的问题)

id  | userid | itemid | messagesent | messageupdate |  messageseen |

int |  int   |   int  |    time()   |    time ()    |    time()    |

然后我需要按时间排序,但这些值在不同的列上

qtres7 = $db->execute_query("select * from notifications where itemid =? OR userid=? ORDER BY messagesent asc",array($itemid,$userid));

任何想法都会受到赞赏,我已经找到了一些关于订单的信息,但是我可以“混合”结果并按照最近到最旧的顺序排列,无论哪个列都是时间..

例如,如果我有3个项目,其中(0000001)旧的和(00000003)其较新的

id  | userid | itemid | messagesent | messageupdate |  messageseen | status | status2 |

1   |   12   |   120  |   0000001   |    -------    |    0000005   |    3   |    1    |
2   |   12   |   121  |   0000001   |    0000003    |    -------   |    2   |    1    |
3   |   12   |   122  |   0000003   |    -------    |    -------   |    1   |    2    |

例如,在这个例子中,我为每个内部的每个内部做回声

if ($userid = $actualuser && $status == 1) { echo $row style1}
if ($userid = $actualuser && $status == 2) { echo $row style2}
if ($userid = $actualuser && $status == 3) { echo $row style3}
if ($userid = $actualuser && $status2 == 1) { echo $row style4}
if ($userid = $actualuser && $status2 == 2) { echo $row style5}

我通过messagesent订购 - 我得到的结果就是这个

也许我有一个错误,因为这不是一个真正的回声,它是我拥有的一个巨大的桌子,试图恢复。

item 3 style 1 - 0000003 -------
item 3 style 5 - 0000003 -------
item 1 style 2 - 0000001 0000005
item 2 style 3 - 0000001 -------
item 1 style 4 - 0000001 0000005
item 2 style 4 - 0000001 -------

问题是第2项通知,因为看到的消息应该在顶部。像

item 1 style 2 - 0000001 0000005
item 1 style 4 - 0000001 0000005
item 3 style 1 - 0000003 -------
item 3 style 5 - 0000003 -------
item 2 style 3 - 0000001 -------
item 2 style 4 - 0000001 -------

也许我的每个循环实际上都是问题..但是这样我得到的所有这个问题就是我可以根据时间设置订单

不,我不想创建一个新的新表,只为这个订单问题更改所有内容。

3 个答案:

答案 0 :(得分:1)

测试它:

ORDER BY GREATEST(`messagesent`,`messageupdate `,`messageseen`)

答案 1 :(得分:1)

您可以使用union statement和group by子句的组合。

select
  n.*,
  x.time
from (
  select
    x.id
    min( x.time ) as `time`
  from (
    select
      id,
      messagesent as `time`
    from notifications
    union all
    select
      id,
      messageupdate
    from notifications
    union all
    select
      id,
      messageseen
    from notifications
  ) x
  group by x.id
) x
left join notifications n on n.id = x.id
order by x.time

更新

或者,您可以使用MySQL的leastgreatest函数来获得相同的效果:

select
  *
from notifications
order by least( messagesent, messageupdate, messageseen )

答案 2 :(得分:0)

尝试

"select * from notifications where itemid =? OR userid=? ORDER BY messagesent ASC, date_added DESC";