我有3个表,想要在一个查询中加入所有按日期时间显示最新的10个条目。
t1: id, username
t2: id, id_t1, med_id, ga_id, au_id, re_id, text, datetime
t3: id, id_t1, pro_id, au_id, re_id, text, datetime
首先我看到简单的左连接和id会很容易,但我得到了双重结果。然后我尝试了内部和外部的连接,也是分组,但结果很糟糕。
所以我的问题是如何在没有t2和t3的最后10个双重结果的情况下加入所有?
答案 0 :(得分:0)
很难说出你究竟想要实现什么,但这里有一条线索如何补充它。
SELECT TOP 10 DISTINCT T1.*
FROM T1
INNER JOIN T2 ON T1.id = T2.id_t1
INNER JOIN T3 ON T1.id = T3.id_t1
ORDER BY (CASE WHEN T2.[DateTime] > T3.[DateTime] THEN
T2.[DateTime]
ELSE
T3.[DateTime]
END) DESC
如果需要从T2和T3中选择字段,则在t2和t3上具有聚合字段的所有T1字段上的GROUP BY是一个选项。否则,链接子查询是可行的方法。
答案 1 :(得分:0)
正如sgeddes已经评论过的那样,很难知道你需要什么,而不会从你的表中看到一些示例数据。了解三个表之间的关系真的很有帮助。
我特别提到的一个问题是:如果有的话,t2和t3是如何相关的?看起来它们可能不是,因为它们每个都有自己的日期时间列。
也许以下人员可以胜任这项工作,但我们需要更多信息才能确定:
(SELECT DISTINCT t1.*, t2.id, t2.au_id, t2.re_id, t2.text, t2.`datetime`, t2.med_id, t2.ga_id, NULL AS pro_id
FROM t1
INNER JOIN t2 ON t1.id = t2.id_t1)
UNION
(SELECT DISTINCT t1.*, t3.id, t3.au_id, t3.re_id, t3.text, t3.`datetime`, NULL AS med_id, NULL AS ga_id, t3.pro_id
FROM t1
INNER JOIN t3 ON t1.id = t3.id_t1)
ORDER BY datetime DESC
LIMIT 10
答案 2 :(得分:0)
以下选择最近十个帖子的用户名和日期时间。
SELECT username, last_ten.`datetime` AS lastpost
FROM t1
INNER JOIN (
SELECT 't2' AS tab, id, `datetime`, t2.id_t1
FROM t2
UNION ALL
SELECT 't3' AS tab, id, `datetime`, t3.id_t1
FROM t3
ORDER BY datetime DESC
LIMIT 10
) AS last_ten ON t1.id = last_ten.id_t1