2013-04-06 45 views
7

tôi có các bảng:SQL tham gia trái được MAX (ngày)

  • thông báo
    • id INT
    • CDate DATETIME
    • ...

  • chủ đề
    • id
    • tên

  • notice_theme
    • id_notice
    • id_theme

Tôi muốn nhận được thông báo mới nhất cho từng chủ đề.

SELECT id_theme, n.id 
FROM notice_theme 
LEFT JOIN (
    SELECT id, cdate 
    FROM notice 
    ORDER BY cdate DESC 
) AS n ON notice_theme.id_notice = n.id 
GROUP BY id_theme 

Kết quả không tốt. Một ý tưởng ? Cảm ơn.

+1

đâu MAX của bạn (ngày)? – hjpotter92

+0

Không đảm bảo rằng ORDER BY của một bảng đã tham gia sẽ được giữ nguyên. Đặt ORDER BY ở bên ngoài chọn. – flup

+0

Bạn cần thêm Max (n.cdate) – Rohit

Trả lời

6

Có rất nhiều cách để giải quyết vấn đề này nhưng tôi thường làm theo cách này. Cần thêm truy vấn con để tính riêng cDate mới nhất cho mỗi ID.

SELECT a.*, c.* 
FROM theme a 
     INNER JOIN notice_theme b 
      ON a.ID = b.id_theme 
     INNER JOIN notice c 
      ON b.id_notice = c.ID 
     INNER JOIN 
     (
      SELECT a.id_theme, MAX(b.DATE_CREATE) max_date 
      FROM notice_theme a 
        INNER JOIN notice b 
         ON a.ID_Notice = b.ID 
      GROUP BY a.id_theme 
     ) d ON b.id_theme = d.id_theme AND 
       c.DATE_CREATE = d.max_date 
+1

Cảm ơn bạn đã trả lời, với truy vấn của bạn (@JW): > id_theme ---- id_notice ---- date_create > 2 --------- --2 ------------ 2013-03-31 09:18:21 > 4 ----------- 2 ---------- --2013-03-31 09:18:21 > 1 ----------- 7 ------------ 2013-03-31 23:27:28 > 2 ----------- 7 ------------ 2013-03-31 23:27:28 > 4 ----------- 11 ----------- 2013-02-16 04:40:21 > 5 ----------- 12 ----------- 2013- 02-05 20:18:21 > 4 ----------- 13 ----------- 2013-03-31 23:27:28 > 2 --- -------- 14 ----------- 2013-03-15 20:18:21 Và với GROUP BY a.id, tôi có cùng một vấn đề với truy vấn của mình:/ – user2252137

+0

bạn có thể cung cấp các bản ghi mẫu với kết quả đã bỏ không? –

+0

http://www.2shared.com/document/nJNTNfCz/example.html – user2252137

Các vấn đề liên quan