2013-04-06 14 views
7

Mam te tabele:SQL przyłączyć lewej dostać MAX (data)

  • zawiadomienie
    • id INT
    • cdate DATETIME
    • ...

  • tematyczne
    • id
    • nazwa

  • notice_theme
    • id_notice
    • id_theme

Chcę uzyskać najnowsze anonse dla każdego tematu.

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 

Wynik nie jest dobry. Pomysł ? Dzięki.

+1

Gdzie jest twój MAX (data)? – hjpotter92

+0

Nie ma gwarancji, że ORDER BY z dołączonej tabeli zostanie zachowany. Ustaw ORDER BY na zewnętrznym select. – flup

+0

Musisz dodać Max (n.cdate) – Rohit

Odpowiedz

6

Istnieje wiele sposobów rozwiązania tego problemu, ale jestem do tego przyzwyczajony. Dodatkowe podzapytanie jest potrzebne do oddzielnego obliczania ostatniego cDate dla każdego 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

Dziękujemy za odpowiedź, z zapytaniem (@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 I z GROUP BY a.ID, mam ten sam problem z moim zapytaniem:/ – user2252137

+0

Czy możesz podać przykładowe rekordy ze swoim pożądanym wynikiem? –

+0

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