2009-08-25 11 views
2

ich habe zwei Tabellen wie diese ->mysql beitreten Grenze mit zwei Tabellen

Categories 
----------- 
id  name 
--------- 
1 -->  a 
2 --> b 
3 --> c 



    Messages 
    ------------ 
    id  catid message 
    --------------------------- 
    1 -->  1 -->  aa 
    2  --> 1 -->  bb 
    3  --> 1 -->  cc 
    4  --> 2 -->  dd 
    5  --> 3 --> ee 
    6  --> 3 --> ff 

    i want to join the tables for get FIRST message from messages table, 

ich will Abfrageergebnis wie diese ->

------------------------------- 
id   name  message 
1   a   aa 
2   b   dd 
3   c   ee 

i einen Code gefunden

select * from categories c, items i 
    -> where i.categoryid = c.id 
    -> group by c.id; 

aber es gibt kein ORDER BY-Verfahren

Antwort

1
SELECT c.*, i.* 
FROM categories c 
JOIN items i ON (i.categoryid = c.id) 
LEFT OUTER JOIN items i2 ON (i2.categoryid = c.id 
    AND (i.message > i2.message OR i.message = i2.message AND i.id > i2.id)) 
WHERE i2.categoryid IS NULL 
ORDER BY c.id; 

Dies tendiert dazu, auf MySQL besser zu funktionieren, da MySQL bei GROUP BY Abfragen so schlecht ist.

0

MySql wird immer den ersten Datensatz aus der zweiten Tabelle zurückgeben, wenn Sie nach dem ersten gruppieren.

SELECT a.id, a.name, b.message FROM Categories a, Messages b WHERE b.catid = a.id GROUP BY a.id ORDER BY a.id 
+0

Das ist keine dokumentierte Richtlinie von MySQL, es trifft einfach in der aktuellen Version zu. Ich würde nicht empfehlen, sich darauf zu verlassen, dass dies für alle Speicher-Engines oder in zukünftigen Versionen gilt. –

+0

Oder in der Tat über einige Arten von Datenbankexport/-import. Wenn es Ihnen ehrlich gesagt egal ist, ob Sie die Nachrichten aa, bb oder cc erhalten, können Sie mit dieser Frage durchkommen. Aber ein ANSI-konformes DBMS würde sich immer noch beschweren. – bobince