MySQL:如何在使用父查询“order by”的同时“排序”子查询列?

时间:2015-01-18 03:57:13

标签: mysql sql subquery sql-order-by multiple-columns

  1. 我有两张桌子。
  2. 他们都有date和item_id列。
  3. 我在item_id上加入了他们。
  4. 结果应由两个日期列一起排序
  5. 以下代码有效,生成正确的结果集......
  6. 但是,它们仅按第一个表的日期排序
  7. 代码

    SELECT t1.*
    FROM   table_one_items t1
           INNER JOIN (SELECT t2.item_id,
                              t2.date_favorited
                       FROM   table_two_favorites t2
                       WHERE  t2.user_id IN( 1, 2, 3 )) t3
                   ON t1.item_id = t3.item_id
                       OR t1.user_id IN( 1, 2, 3 )
    WHERE  t1.published = 1
    GROUP  BY t1.item_id
    ORDER  BY t3.date_favorited DESC,
              t1.date_created DESC 
    

    问题:

    我正在寻找chronological order中的项目,尽管来自一个表和一个subquery表及其自己的日期列。我该怎么做呢?

    我尝试了什么:

    我尝试移动t3.date并订购subquery本身,但这不起作用。任何修改子查询的尝试都会改变结果集,我想不出另一种方法来编写它以获得相同的结果但是具有正确的顺序。我知道可能有更好的方法来编写这个查询,但我也无法解决这个问题。我觉得这很有用!

    其他信息:

    第一个表是所有项目的索引,而第二个表是“收藏夹”表,仅包含已被用户收藏的项目。使用t1.item_id = t3.item_id OR t1.user_id IN(1,2,3)我基本上会在t1中获取由这些用户创建的项目或已被这些用户收藏的项目。

    示例:

    表一“项目表”:(日期为“创建日期”)

    item_id 1 user_id 2 date_created 2015-01-1 00:00:00
    item_id 2 user_id 2 date_created 2015-01-3 00:00:00
    item_id 3 user_id 1 date_created 2015-01-5 00:00:00
    item_id 4 user_id 3 date_created 2015-01-7 00:00:00
    

    表二“用户收藏夹”:(日期为“日期收藏”)

    item_id 2 user_id 2 date_favorited 2015-01-6 00:00:00
    item_id 1 user_id 2 date_favorited 2015-01-6 00:00:00
    item_id 1 user_id 3 date_favorited 2015-01-8 00:00:00
    

    期望的结果:

    item_id 3 (ordered by date_created: 2015-01-5 00:00:00)
    item_id 4 (ordered by date_created: 2015-01-7 00:00:00)
    item_id 2 (ordered by date_favorited: 2015-01-6 00:00:00)
    item_id 1 (ordered by date_favorited: 2015-01-8 00:00:00)
    

    当前结果:

    item_id 1 (ordered by date_created)
    item_id 2 (ordered by date_created)
    item_id 3 (ordered by date_created)
    item_id 4 (ordered by date_created)
    

    非常感谢任何帮助。 (而且我一定会给出答案!)

2 个答案:

答案 0 :(得分:1)

尝试在ORDER BY中使用CASE语句来选择所需的日期,所以:

ORDER BY 
    CASE
        WHEN t3.date > t1.date AND t3.item_id = t1.item_id THEN t3.date
        ELSE t1.date
    END DESC

如果要按两个日期的最大值排序。但是,我不确定你的子查询会做你期望的事情;除非用户创建的项目总是在table_two中,无论他们是否有用它们

答案 1 :(得分:0)

请尝试使用order by子句:

ORDER BY 
    COALESCE(t3.date,t1.date) DESC;

以上查询可以帮助您订购您的要求,尽管您有机会调整您的SQL。