MySQL两个数据库,在一种情况下按一列排序,在另一种情况下按另一列排序

Don*_*len 8 php mysql sql-order-by

我有两张桌子.第一个表看起来像这样:

表:记录

    rid  |   user id   |     title     |    whenadded    | public
--------------------------------------------------------------------
    1        212           Example        2012-06-28         1
    2        217           Test Rec       2012-07-05         1
    3        212           Another        2012-07-02         1
    4        212           Unlisted       2012-05-02         0
    5        217           Success        2012-04-08         1
    6        238           Always         2012-04-18         1

表:喜欢

    id  |   user id   |     rid     |    whenliked
------------------------------------------------------
    1        212            2            2012-07-06
    2        205            1            2012-06-30
    3        212            5            2012-07-04

在'Records'表中,'rid'被设置为主索引.在'Likes'表中,id被设置为主索引.

我正在使用PHP.PHP将为MySQL提供一个值作为参考.我想要一个MySQL查询,它将执行以下操作:

伪代码:

$userid = 212;
$SQL = 'SELECT DISTINCT records.* 
        FROM records,likes 
        WHERE (records.userid = ' . $userid . 
          ' AND records.public = 1) 
            OR (records.id = likes.rid AND likes.userid = ' . $userid . 
          ' AND records.public = 1) 
        ORDER BY likes.whenliked DESC, records.whenadded DESC 
        LIMIT 50;';
Run Code Online (Sandbox Code Playgroud)

查看我刚才提供的$ SQL查询.这是我尝试开发我想要的查询,但它没有实现我想要的; 它非常接近,但仍然订购不正确.该查询是我自己开发的最好的,然后根据我在StackFlow和Google上的其他地方搜索解决方案找到的.

这些是我试图通过以下方式订购它的条件:

  1. 所有选定的记录必须是公开的(records.public = 1).
  2. 如果记录属于用户(在本例中为212),则按记录排序记录.当添加时.
  3. 如果记录不属于用户,但它是用户喜欢的记录,则按likes.whenliked订购记录.
  4. 日期将从最新到最旧订购.

返回的查询的最终结果将如下所示(请记住,当返回数据中不存在时,它仅供参考,因此您可以看到它是如何排序的):

    rid  |   user id   |     title     |    whenadded    | public   |  whenliked {not incl}
------------------------------------------------------------------------------------
    2        217           Test Rec       2012-07-05         1        2012-07-06
    3        212           Another        2012-07-02         1
    5        217           Success        2012-04-08         1        2012-06-30
    1        212           Example        2012-06-28         1

希望有道理.随意提问,我会尽我所能澄清.

提前感谢您的时间,您的考虑,以及阅读本文.即使没有响应或找不到解决方案,您的时间仍然非常感谢!:)

Dan*_*Dan 4

您排序所依据的字段不必是数据库中的现有字段。您还可以使用您在选择中定义的字段:

SELECT IF(records.userid = ' . $userid . ', records.whenadded, likes.whenliked) as date 
Run Code Online (Sandbox Code Playgroud)

现在您可以按部分顺序使用它:

ORDER BY date DESC
Run Code Online (Sandbox Code Playgroud)

来自MySQL 手册

可以使用 AS alias_name 为 select_expr 指定别名。别名用作表达式的列名,可以在 GROUP BY、ORDER BY 或 HAVING 子句中使用

  • 请参阅http://sqlfiddle.com/#!2/9a877/7 了解@Dan 解决方案。我确实认为这是比 UNION 更好的解决方案。IF 满足您在描述中指定的数字 2 和 3 条件。 (3认同)