【问题标题】:SORT BY date in left+right union join table左+右联合联接表中的按日期排序
【发布时间】:2013-07-21 13:06:17
【问题描述】:

我有 2 张包含大量相同数据的表格(适用于制造 2 种语言的名片)。

JOIN(据我所知模拟完全外连接,做左联合右连接)它们以并排显示数据以便于复制。

table a has data in language1
table b has data in language2

不是每个人都有语言 1 和语言 2 数据,所以只有语言 1 或只有语言 2。

我做了这样的查询:

SELECT
<long list of selected rows from table a and table b as afiled,bfield>
FROM tablelanguage1 a 
LEFT JOIN tablelanguage2 b
ON a.email=b.email
UNION
SELECT<long list of selected rows from table a and table b as afiled,bfield>
FROM tablelanguage1 a 
RIGHT JOIN tablelanguage2 b
ON b.email = a.email
ORDER BY adatetime DESC, bdatetime DESC

这显示了我需要的所有内容,但我在排序时遇到了麻烦:它显示了除language2-only entries correctly 之外的所有内容。 Language2-only(table b) 条目总是最后的,即使日期晚于某些 language1+language2language1-only 条目。

关于如何在这种情况下正确编码ORDER BY 有什么建议吗?非常感谢!

【问题讨论】:

  • 您使用的是哪个 RDBMS?为什么要模拟 FULL JOIN 而不是使用 FULL JOIN
  • 使用 libmysql - 5.5.31。模拟因为它在完全连接时给了我“无法解析查询”(以及 yeeeeeah,我在 sql 东西中很菜鸟)

标签: sql sorting join


【解决方案1】:

您可以使用COALESCE() 函数解决此问题:

ORDER BY COALESCE(adatetime,bdatetime) DESC

COALESCE() 返回集合中的第一个非 NULL 值。您得到的结果是有道理的,因为对于所有那些“仅语言 2”记录,adatetimeNULLORDER BY 中的多个字段被视为一个层次结构,因此所有这些 NULL 值被排序在一起,然后它考虑 bdatetime 值。 COALESCE() 将根据填充的日期对所有记录进行排序,而不是第一个然后另一个。

【讨论】:

  • 我知道这很简单......非常感谢,就像一个魅力!是的,我得到的结果对我来说是有意义的,我只是不知道如何得到我想要的结果!
猜你喜欢
  • 2016-12-13
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 2011-08-11
  • 2020-08-03
  • 2012-10-17
相关资源
最近更新 更多