webForumDet fria alternativet

group by, sortering fel

6 svar · 289 visningar · startad av turbonallen

turbonallenMedlem sedan nov. 200116 inlägg
#1

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
#2

Ta bort group by.

ta även bort apostroferna från

WHERE to_id='". $id ."'

eftersom to_id är numeriskt.

turbonallenMedlem sedan nov. 200116 inlägg
#3

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
#4

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.)

turbonallenMedlem sedan nov. 200116 inlägg
#5

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
#6
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
turbonallenMedlem sedan nov. 200116 inlägg
#7

.. 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!

137 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)