2011-11-30 197 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;