【问题标题】:MySQL: How to "order by" a subquery column while also using a parent query "order by"?MySQL:如何在使用父查询“order by”的同时“order by”子查询列?
【发布时间】:2015-01-18 03:57:13
【问题描述】:
  1. 我有两张桌子。
  2. 它们都有 date 和 item_id 列。
  3. 我在 item_id 上加入了他们。
  4. 结果应按两个日期列一起排序
  5. 以下代码有效,生成正确的结果集...
  6. 但它们仅按第一个表的日期排序

代码

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)

任何帮助将不胜感激。 (而且我一定会标记答案!)

【问题讨论】:

  • 你能用样本数据预期输出编辑问题吗?
  • 添加了示例表。
  • 你可以使用SPROC 吗?我的意思是它有很长的路要走,但是您可以从一个表中插入值,然后从另一个表中插入值,以便它们按表日期排序。
  • 现在更加混乱了。期望的结果和当前的结果不仅顺序完全矛盾。
  • 我已经回去重做表格了。让我知道这是否更好。

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


【解决方案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 中,无论他们是否收藏过它们

【讨论】:

  • 这行得通!您的答案只缺少一件事。 (编辑它,我会接受它!:))在 WHEN 它应该是t3.date > t1.date AND t3.item_id = t1.item_id。这似乎对我有用。非常感谢!
  • 只是补充一点,这样答案就更清楚了——项目总是在 table_one 中,但并不总是在 table_two 中。然而子查询似乎工作。您所说的子查询可能没有达到预期的效果是什么意思?
  • 您正在进行内部连接,这意味着必须在两个表中
  • 在这种情况下,表一包含对表二中所有项目的引用(将其视为索引),但表二不包含表一中的所有项目。该子查询(表三)将始终返回可在表一中找到的项目,因此内部连接表一和表三将始终与表一中的项目“匹配”或“相交”。 Table 1 (T1) { id 1 id 2 id 3 id 4 } Subquery Results Table (T3) { id 2 id 3 } Inner join (ON t1.id = t3.id) results: {Table One rows: 2, 3 } 但如果我犯了错误,请告诉我。
【解决方案2】:

尝试使用 order by 子句:

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

尽管您有机会调整 SQL,但上述查询可以帮助您根据您的要求进行排序。

【讨论】:

  • 遗憾的是,这不起作用 - 结果订单都混杂成我无法确定的模式。我认为因为 t3.item_id = t1.item_id 之间需要有联系。例如,请参阅我对 BenAdams 回答的评论。我很想看看这是否可行,尽管我觉得 Ben 的回答可能对性能更好。也许?
  • COLEACE 被添加以在 t3.date 的情况下引用 t1.date 假设如果 table_two 没有值,则 t3.date 将为空。它无法解决其他条件(即 t3.item_id=t1.item_id),case ... end 将是您的上下文中的好解决方案。
猜你喜欢
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 2020-05-15
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
相关资源
最近更新 更多