Hej
Jag har en tabell enligt följande:
[ wms_messages ]
[message_id] [from_id] [to_id] [datum] [message_body]
Det jag vill göra är att jag vill plocka ut de fem senaste message_body, med samma to_id, men olika from_id
dvs de fem senaste (datummässigt) som har unikt from_id men samma to_id
min SQL-sats ser för tillfället ut såhär:
$query = mysql_query("SELECT * FROM wms_messages WHERE to_id='". $id ."' GROUP BY from_id ORDER BY datum DESC LIMIT 5") or die (mysql_error());
Detta ger dock inte riktigt der resultat jag vill ha:
Jag får ut fem st. rader, och de är sorterade efter datumordning, med det senaste datumet först, så långt är det rätt.
Dock, när den väljer ett fält från from_id, tar den det fältet som har det datum som är längst bak i tiden, och inte det datumet som är senast, dvs om tabellen ser ut som följande:
[to_id] [from_id] [datum] [text]
3 2 0402 meddelande 1
3 1 0403 meddelande 1
3 4 0404 meddelande 1
3 2 0405 meddelande 2
3 2 0406 meddelande 3
3 1 0407 meddelande 2
3 4 0408 meddelande 2
3 1 0409 meddelande 3
Så får jag ut:
3 4 0404 meddelande 1
3 1 0403 meddelande 1
3 2 0402 meddelande 1
Och det är ju halvt rätt, av det den får fram,
sorterar den det senaste datumet högst upp osv ..
bara det att den har plockat fel from_id
(den har tagit det med det avlägsnaste datumet)
Men jag vill ha ut:
3 1 0409 meddelande 3
3 4 0408 meddelande 2
3 2 0406 meddelande 3
dvs det senaste datumet från varje unik from_id
det verkar som att det är ORDER BY man skall använda för att sortera, men jag får det inte att fungera.
Någon som vet hur jag skall gå tillväga?
Tack på förhand!
LarsGMedlem sedan dec. 200012 464 inlägg Ta bort group by.
ta även bort apostroferna från
WHERE to_id='". $id ."'
eftersom to_id är numeriskt.
Okej, apostroferna borta! :)
Men om jag tar bort group by, kommer det att innebära att jag, i detta fall, får ut alla 8 rader, och det vill jag ju inte, jag är bara intresserad av varje unikt from_id som har det senaste datumet lagrat.
Eller har jag missat något?
LarsGMedlem sedan dec. 200012 464 inlägg Nej, då du har limit 5 så får du 5 poster.
Jag förstår inte hur du har tänkt att group by skulle fungera.
Den fråga som du skrev i första inlägget är felaktig eftersom det inte går att bestämma ett entydigt resultat. (Egentligen skulle du få ett semantiskt fel men Mysql är den enda DBMS som godkänner det.)
Hej, först ett tack för svaren hittils!
Jag vet inte riktigt heller hur group by fungerar, då jag än så länge är rätt så kass på SQL.
Men, jag tror att du missat min poäng
Säg att min tabell ser ut som ovan, dvs att jag har 8 poster i den.
Det jag vill med min SQL-sats är att jag vill ta ut alla poster, med ett unikt from_id, dock max 5 poster.
I fallet ovan finns det bara 3 st poster med unikt from_id. Och när det finns fler poster med samma from_id, är det alltså den som har det senaste datumet jag vill åt.
Av en tabell som har dessa poster:
[to_id] [from_id] [datum] [text]
3 2 0402 meddelande 1
3 1 0403 meddelande 1
3 4 0404 meddelande 1
3 2 0405 meddelande 2
3 2 0406 meddelande 3
3 1 0407 meddelande 2
3 4 0408 meddelande 2
3 1 0409 meddelande 3
Vill jag alltså få ut dessa poster:
3 1 0409 meddelande 3
3 4 0408 meddelande 2
3 2 0406 meddelande 3
Eftersom resterande poster i tabellen har samma from_id som de tre ovan, men med ett lägre datum.
Hoppas ni förstår hur jag menar, annars skall jag försöka förklara ännu mer ingående!
Igen, tack på förhand!
LarsGMedlem sedan dec. 200012 464 inlägg SELECT m1.to_id,m1.from_id,m1.datum, m1.message
FROM wms_messages m1 inner join wms_messages m2
on m1.from_id = m2.from_id
and m1.to_id = m2.to_id
WHERE m1.to_id = ". $id ."
GROUP BY m1.to_id,m1.from_id,m1.datum, m1.message
having m1.datum = max(m2.datum)
ORDER BY m1.datum desc
LIMIT 5
.. Det fungerar ju helt utmärkt!
Tack så mycket!
Det såg ut att vara några nivåer över mina knappa kunskaper dock..!
Stort tack!