簡體   English   中英

來自UNION SUBSELECT的MySQL字段

[英]MySQL field from UNION SUBSELECT

我的數據庫具有下表:

  • 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

非常感謝關於是否和/或如何實現的任何提示,謝謝!

您需要將包含來自t3和t4的最新注釋的表編譯到表d然后還將這兩個結果合並到注釋表cc將僅保存1個條目,即最近的id,或者來自t3或來自t4

ct會告訴您從哪個表獲得響應;

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; 

首先嘗試此查詢,它應該返回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;

如果可以,請讓我們將此查詢與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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM