MySQL - JOIN 还是 UNION - 不确定,也许两者都需要。

3

我想合并两个文件的数据,但是在表达排序时遇到了困难。如果第一个文件中存在 CREATED 日期和第二个文件中存在 SHARED_DATE 日期且 SHARED_DATE 大于 CREATED,则希望按照这两个日期进行排序。

    file 1 : NODE# 
    fields: CREATED, CHANGED

    file 2 : SHARE_CONTENT   
    fields:  SHARED_DATE ,  NODE# (foreign key)


select * from NODE as n left join SHARE_CONTENT as s on (s.NODE#=n.NODE#)
ORDER BY [higher of n.CREATED  and s.SHARED_DATE]
3个回答

1

按照最后日期排序

SELECT n.*,s.*,
(CASE WHEN n.CREATED > s.SHARED_DATE then n.CREATED else s.SHARED_DATE end) as LastDate
FROM node as n LEFT JOIN share_conten as s on (s.NODE#=n.NODE#)
ORDER BY LastDate DESC

这段代码是否正确处理了s不存在的情况?在我看来,它不会,因为n.created > s.shared_date不会被判定为真。 - Dawood ibn Kareem
你是对的...但是还有一个第二部分来解决这个问题。 - rauschen
是的,我没有看到第二部分,因为我在“SQL”标签下找到了这个问题,但是第二部分却没有这个标签。我不知道为什么楼主没有编辑原来的问题。我想我会去发布我的答案给第二部分;以备 Mustapha George 未来需要给多个孩子取名字时可以参考 :-) - Dawood ibn Kareem

0

我的 MySQL 技能有点生疏,但是看起来你想在一个查询中将两个表合并,同时匹配返回的行并显示所有信息?我认为这是一个 FULL OUTER JOIN。

这里有一个很好的 SQL joins 的视觉参考。


0

你可以使用 ORDER BY MAX(n.CREATED, s.SHARED_DATE); 由 FULL OUTER JOIN 引入的 NULL 值将被 MAX 忽略(也就是说,任何东西和 NULL 的最大值仍然是那个东西)。


看起来很有前途,但是mySQL 4.1似乎不喜欢ORDER BY(CAL1, VAL2)。 - Mustapha George

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接