2

所以我为一个特定的查询加入了两个表。在一个复杂的 SELECT 语句之后,该表会模糊地看起来像这样: $myid = 3

邮政编码 | FromUserID | 至用户 ID|日期 | 发表过 | 点赞数|SeenLike
61 | 48 | 3 | 2013 年 5 月 11 日 | 1 | 1 | 1
59 | 3 | 3 | 2013 年 4 月 11 日 | 1 | 1 | 0
58 | 3 | 3 | 2013 年 4 月 11 日 | 1 | 1 | 1
25 | 47 | 3 | 2013 年 3 月 11 日 | 1 | 2 | 0
53 | 56 | 3 | 2/11/13 | 0 | 3 | 1
21 | 3 | 55 | 2013 年 1 月 11 日 | 1 | 0 | 无效的
20 | 56 | 3 | 30/10/13| 1 | 0 | 无效的
18 | 47 | 3 | 29/10/13| 0 | 0 | 无效的

如果 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
}

(我知道这是完全错误的,它只是为了模糊地说明我的目标)所以它会对结果进行排序,如下所示:

邮政编码 | FromUserID | 至用户 ID|日期 | 发表过 | 点赞数|SeenLike
59 | 3 | 3 | 2013 年 4 月 11 日 | 1 | 1 | 0
25 | 47 | 3 | 2013 年 3 月 11 日 | 1 | 2 | 0
53 | 56 | 3 | 2/11/13 | 0 | 3 | 1
18 | 47 | 3 | 29/10/13| 0 | 0 | 无效的
61 | 48 | 3 | 2013 年 5 月 11 日 | 1 | 1 | 1
58 | 3 | 3 | 2013 年 4 月 11 日 | 1 | 1 | 1
21 | 3 | 55 | 2013 年 1 月 11 日 | 1 | 0 | 无效的
20 | 56 | 3 | 30/10/13| 1 | 0 | 无效的

我该怎么做呢?我已经尝试过 IF 和 CASE,但到目前为止都没有奏效。也希望对任何答案做出解释!谢谢你的帮助!

4

2 回答 2

2

您可以创建两个子查询,然后将它们联合起来。第一个子查询将具有“WHERE FromUserID = $myid AND NumLikes > 0 ORDER BY SeenLike ASC, Date DESC”和第二个“WHERE FromUserID != $myid ORDER BY PostSeen ASC, Date DESC”。

于 2013-11-05T18:19:56.733 回答
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
于 2013-11-05T18:45:31.803 回答