MySql ORDER BY多列IF AND

时间:2013-11-05 18:12:49

标签: php mysql

所以我为特定查询加入了两个表。在复杂的SELECT状态之后,表格看起来像这样: $ myid = 3

PostID | FromUserID | To User ID|Date     | PostSeen | NumLikes  |SeenLike
61     |     48     |     3     | 5/11/13 |    1     |     1     |  1
59     |     3      |     3     | 4/11/13 |    1     |     1     |  0
58     |     3      |     3     | 4/11/13 |    1     |     1     |  1
25     |     47     |     3     | 3/11/13 |    1     |     2     |  0
53     |     56     |     3     | 2/11/13 |    0     |     3     |  1
21     |     3      |     55    | 1/11/13 |    1     |     0     |  null
20     |     56     |     3     | 30/10/13|    1     |     0     |  null
18     |     47     |     3     | 29/10/13|    0     |     0     |  null

如果NumLikes等于0,则SeenLike列为空。 PostSeen将始终为0或1.我在这里以简化格式输入日期,但其正确的DateTimed。

基本上,我想做一些相当于

的事情
if(FromUserID == $myid && NumLikes > 0){
ORDER BY SeenLike ASC, Date DESC
}
if (FromUserID != $myid) {
ORDER BY PostSeen ASC, Date DESC
}

(我知道这是完全错误的,它只是为了模糊地说明我的目标) 因此,它会将结果排序如下:

PostID | FromUserID | To User ID|Date     | PostSeen | NumLikes  |SeenLike
59     |     3      |     3     | 4/11/13 |    1     |     1     |  0
25     |     47     |     3     | 3/11/13 |    1     |     2     |  0
53     |     56     |     3     | 2/11/13 |    0     |     3     |  1
18     |     47     |     3     | 29/10/13|    0     |     0     |  null
61     |     48     |     3     | 5/11/13 |    1     |     1     |  1
58     |     3      |     3     | 4/11/13 |    1     |     1     |  1
21     |     3      |     55    | 1/11/13 |    1     |     0     |  null
20     |     56     |     3     | 30/10/13|    1     |     0     |  null

我该怎么做呢?我已经尝试了IF和CASE,但到目前为止还没有。非常感谢任何答案的解释! 谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

你可以创建两个子查询然后UNION它们。第一个子查询将具有'WHERE FromUserID = $ myid AND NumLikes> 0订购SeenLike ASC,日期DESC'和第二个'WHERE FromUserID!= $ myid ORDER BY PostSeen ASC,Date DESC'。

答案 1 :(得分:1)

您不能通过一个子句订购一半结果,其余通过另一个子句订购。如果你考虑一下,它没有任何意义。

但是,您可以在order子句中使用任何类型的表达式,如布尔值或整数

例如

ORDER BY FromUserID = $myid desc, -- this will be true or false depending on the fromuserid
    (FromUserID = $myid)*SeenLike ASC, --this will be 0 if fromuser is not equal to myid or =seenlike otherwise
    (FromUserID != $myid)*PostSeen ASC, -- and so on
    Date DESC