Mysql使用排序结果在一个查询中加入3个表

时间:2015-03-11 15:21:17

标签: mysql

我有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个双重结果的情况下加入所有?

3 个答案:

答案 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