2011-11-30 145 views
0

我的数据库有如下表:MySQL的领域

  • T1:博客文章
  • T2:每个博客帖子
  • T3附加表:为博客文章
  • T4英文注释:西班牙语对博客文章的评论

而且我有以下用例: 我需要获取最新的公司的ID每个博客文章连同博客文章本身。最新的评论可能在t3或t4表中。

我想出了以下的SQL,但它没有按预期工作。

SELECT t1.id, 
t1.one, 
t1.two, 
(
    SELECT id FROM (
     (SELECT * FROM t3 where t3.refid = t1.id) 
     UNION (SELECT * FROM t4 where t4.refid = t1.id) 
     ORDER BY datetime ASC LIMIT 1 
    ) AS tempTable) 
AS someValue 
FROM t1 
LEFT JOIN t2 ON (t1.id = t2.id) 
WHERE t1.otherid=42 AND t1.somefield > 0 
ORDER BY t1.someOtherField 
LIMIT 5 

任何提示,如果和/或如何这是可能的高度赞赏,谢谢!

+0

当你说它不能按预期工作时,目前发生了什么?还有表t3和t4他们是否有独特的主键,如果你将如果要显示一个英文评论,而不是西班牙评论让我们说如何检测? – SGB

+0

对不起,我应该在帖子中写下。 mysql说“未知的列t1.id”,似乎该子选择无法访问来自外部查询的数据。这可能是因为子选择在select_expr中,而不在where_condition中。 – moritz

+0

我想显示来自包含最新评论的表格的评论。当然在真正的桌子上有钥匙 - 这些只是虚拟的......) – moritz

回答

0

需要编译的表与T3和T4的最新评论到表d 随后也将两个结果合并为comments表cc将只持有1项,最近的ID,无论是从t3 ,或者从t4

c.t会告诉你从哪个表中得到答复;

SELECT t1.*, 
     t2.*, 
     c.id AS cid, 
     c.dt AS dt, 
     c.t AS t 
FROM t1 
     LEFT JOIN t2 
     ON (t1.id = t2.id) 
     LEFT JOIN (SELECT d.id, 
         Max(d.dt) AS dt, 
         d.refid, 
         d.t  AS t 
        FROM (SELECT t3.id, 
           Max(DATETIME) AS dt, 
           t3.refid, 
           3    AS t 
          FROM t3 
          GROUP BY t3.refid 
          UNION ALL 
          SELECT t4.id, 
           Max(DATETIME) AS dt, 
           t4.refid, 
           4    AS t 
          FROM t4 
          GROUP BY t4.refid) d 
        GROUP BY d.refid) c 
     ON c.refid = t1.id; 
0

尝试此查询首先,应该从T3和T4返回最新评论 -

SELECT t_comments1.* FROM (SELECT * FROM t3 UNION SELECT * FROM t4) t_comments1 
    JOIN (SELECT refid, MAX(datetime) max_datetime FROM (SELECT * FROM t3 UNION SELECT * FROM t4) t GROUP BY t.refid) t_comments2 
    ON t_comments1.refid = t_comments2.refid AND t_comments1.datetime = t_comments2.max_datetime; 

如果OK,那就让我们用T1表结合这个查询 -

SELECT t1.*, t_comments.* FROM t1 
    LEFT JOIN (
    SELECT t_comments1.* FROM (SELECT * FROM t3 UNION SELECT * FROM t4) t_comments1 
     JOIN (SELECT refid, MAX(datetime) max_datetime FROM (SELECT * FROM t3 UNION SELECT * FROM t4) t GROUP BY t.refid) t_comments2 
     ON t_comments1.refid = t_comments2.refid AND t_comments1.datetime = t_comments2.max_datetime 
) t_comments 
    ON t1.id = t_comments.refid;