outer join és rendezés
Üdv!
Adott az alábbi sql lekérdezés. A lekérdezés több táblából gyűjt adatot, többek között az üzenetek táblából is.
Hogyan lehet megoldani azt, hogy az üzenetek táblából a legutóbb beszúrt sor adatait kérdezze le?Az ORDER BY után megpróbáltam megadni neki, hogy idő szerint csökkenő sorrendbe kérdezze le, de nem hozta a kívánt hatást.
■ Adott az alábbi sql lekérdezés. A lekérdezés több táblából gyűjt adatot, többek között az üzenetek táblából is.
Hogyan lehet megoldani azt, hogy az üzenetek táblából a legutóbb beszúrt sor adatait kérdezze le?
SELECT conversations.id AS id, conversations.name AS name, messages.message AS message, messages.time AS time FROM conversation_members INNER JOIN conversations ON conversations.id=conversation_members.conversation LEFT OUTER JOIN messages ON messages.conversation=conversations.id WHERE conversation_members.user=$user[id] GROUP BY conversations.id ORDER BY messages.time DESC
legutóbb beszúrt?
Van egy time mező, amely az
GROUP BY és HAVING?
GROUP BY
ésHAVING
?Group by-t már tartalmaz a
És hol szerepel benne a MAX
Első próbálkozás: GROUP BY
Második: GROUP BY conversations.id HAVING messages.time = MAX(messages.time)
Nem szerepel
Valóban az összes beszélgetés (egyetlen) legutóbbi üzenetét akarod lekérdezni? Nekem könnyebb lenne, ha pontosan megfogalmaznád a feladatot és ismerném a táblák struktúráját. Ettől még nem a konkrét megoldást mondanám meg, de valószínűleg tudnék segíteni elérni.
Mi a probléma?
Van három tábla, név és
conversations - a beszélgetések azonosítóját és témáját (nevét) tartalmazza.
Mezők: id - name
conversation_members - a beszélgetések tagjait tartalmazó tábla.
Mezők: id - user - conversation - left - read - time
Ahol a conversation a conversations tábla ID-jét tartalmazza.
messages - az üzeneteket tartalmazó tábla.
Mezők: id - user - conversation - message - time
Ahol a conversation a conversations tábla ID-jét tartalmazza.
Ki szeretném listázni az egyes beszélgetéseket (conversations) úgy, hogy az utolsó üzenet ideje és szövege is legyen lekérdezve, valamint csak azok a beszélgetések jelenjenek meg, amelyekben részt vesz az adott felhasználó, az utolsó üzenet érkezésének idejének sorrendjében. Az user mező értéke mindig a felhasználó azonosítója, amely php-ban az $user[id] változóban van tárolva.
A lekérdezésből szeretném megkapni még a left és read mező értékét is.
Csak egyeseket?
Mivel a Júzer résztvétele fontos, az első SELECT a conversation_members táblát érinti, ahol WHERE user_id szűr, ennek listája megadja a beszélgetéseket (id). (Persze benne lehet a left, stb. mező is.)
A többit - azt javaslom - először csináld meg belső SELECT-ekkel és WHERE-ekkel, utána könnyebb lesz ezeket JOIN-okra cserélni.
A következő (belső) SELECT lekéri a megfelelő id-vel rendelkező conversations bejegyzéseket.
Ezen belül a harmadik SELECT a messages, ahol már menni fog a MAX.
Ezt a hármast rakd össze SELECT-ekkel, aztán meglátjuk, mit lehet belőle "kiJOINolni".
Szerk.: Ha viszont nem csak a legutóbbi messages kell (a listába), akkor nem biztos, hogy menni fog egy lekérdezéssel.
Nekem ez jött össze, ami nem
Kiindulásnak
Köszönöm szépen a
Ennek köszönhetően már kezdem érteni, hogy mit s hogyan kellene.
A select eltüntetésére még visszatérek, miután teljesen elsajátítom a bonyolultabb lekérések működését.
Upd.: Ha nincs üzenet az adott beszélgetésben, akkor nem jelenik meg a listában a beszélgetés neve sem. Ezt lehet orvosolni? (Ezért használtam Outer Join-t)
Ezt nem feltétlenül fontos megcsinálni, hiszen meg tudom oldani, hogy a beszélgetés létrehozásakor egyből meg kelljen adni az üzenetet.
További "segítség"
"Keressük az összes beszélgetést és annak az első hozzászólását, amiknek XY Júzer a tagja, ..."
Ha magyarul megvan (és pontosan), akkor az SQL már gyerekjáték :)... (Aztán a sok SELECT, majd JOIN.)