Поле MySQL от UNION SUBSELECT - PullRequest
       40

Поле MySQL от UNION SUBSELECT

0 голосов
/ 30 ноября 2011

В моей базе данных есть следующие таблицы:

  • t1: сообщения в блоге
  • t2: дополнительная таблица для каждого сообщения в блоге
  • t3: комментарии на английском для блога
  • t4: испанские комментарии к сообщениям в блоге

И у меня есть следующий вариант использования: Мне нужно получить идентификатор самого нового комментария для каждого сообщения в блоге вместе с самим сообщением в блоге. Последний комментарий может быть либо в таблице 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

Любые советы о том, если и / или как это возможно, высоко ценятся, спасибо!

Ответы [ 2 ]

0 голосов
/ 01 декабря 2011

Попробуйте сначала этот запрос, он должен вернуть последние комментарии от 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;
0 голосов
/ 01 декабря 2011

вам нужно скомпилировать таблицу с самыми последними комментариями из t3 и t4 в таблицу d, а затем объединить два результата в таблицу комментариев c эта c будет содержать только 1 запись, самый последний идентификатор,либо 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; 
...