Grupowanie wynikow na podstawie dwoch kolumn w MySQL

0

Witam mam taką tabele(wiadomosci miedzy userami: [from_id,to_id]

message_id|from_id|to_id|send_date|content

1|16|17|2010-02-11|tresc
2|17|16|2010-03-12|odpowiedz na tresc
3|16|3|2010-02-13|wiadomosc do innego usera

i teraz chcę uzyskać grupowanie na podstawie from_id i to_id aby dostać coś takiego:

2|17|16|2010-03-12|odpowiedz na tresc
3|16|3|2010-02-13|wiadomosc do innego usera

czyli najnowszą odpowiedz w rozmowie

zrobiłem coś takiego, ale nie działa poprawnie:

$sql = "SELECT message_id FROM messages
                WHERE from_id='$pid' OR to_id='$pid'
                 
                GROUP By from_id, to_id
                ORDER BY send_date DESC"; 
0

hmmm chyba nie masz pojęcia do czego służy grupowanie, powinieneś mieć jakąś funkcję agregującą
możesz słowami opisać co chcesz uzyskać?
czy chcesz dostać wszystkie wiadomości, w których jedną ze stron był jakiś user?

0

Tak wszystkie wiadomości, tylko np. gdy w rozmowie było > 1 wiadomośc to chcę dostać tylko ta najnowszą. Nie umiem tego inaczej opisać

0
select top 1 message_id -- wybieramy tylko pierwszy rekord
from messages
where from_id=$pid or to_id=$pid -- czyli dany user byl jedna ze stron wiadomosci
order by send_date desc -- sortowanie, na poczatku najswiezsza data
0

chodzi mi o to żeby wyciągnać wszystkie rozmowy usera, może być ich np 100 i wyciagnac z kazdej rozmowy najnowszy wiersz

tak jak działa archiwum na gg

0

musisz zrobić tak jak tu Zapytanie SQL wybierajace konkretne wiersze bez powtarzania - chodzi o ideę

0

przez rozmowe użytkownika X rozumiesz zbiór rekordów gdzie X jest jako from lub to?

a poza tym nie mozna bylo od razu pozadnie opisac o co chodzi? :)

0
massther napisał(a)

przez rozmowe użytkownika X rozumiesz zbiór rekordów gdzie X jest jako from lub to?

Tak dokładnie o to mi chodzi

0

Hallo JimMorrison!

JimMorrison napisał(a)

chodzi mi o to żeby wyciągnać wszystkie rozmowy usera, może być ich np 100 i wyciagnac z kazdej rozmowy najnowszy wiersz

tak jak działa archiwum na gg

Moglbys sprecyzowac co rozumiesz pod pojeciem "rozmowa usera"?

Czy rozmowa usera 17 z userem 16 w piatek na temat pogody to "pierwsza rozmowa"?
Czy rozmowa usera 17 z userem 16 w piatek na temat nalesnikow to "druga rozmowa"?
Czy rozmowa usera 17 z userem 16 w sobote na temat pogody to kontynuacja "pierwszej rozmowy" czy moze to juz "trzecia rozmowa"?

Czy rozmowa to wiele rekordow w tabeli, a moze jeden rekord w tabeli to jedna rozmowa?

Pozdrawiam
Markus

0
declare @t table (message_id int, from_id int, to_id int, send_date datetime, txt nvarchar(max))
insert into @t values ( 1,1,2,'2000-1-1 10:00:00', '...')
insert into @t values ( 2,2,1,'2000-1-1 10:00:05', '...')
insert into @t values ( 3,1,2,'2000-1-1 10:00:08', '...')
insert into @t values ( 4,2,1,'2000-1-1 10:00:11', '...')
insert into @t values ( 5,1,3,'2000-1-1 10:00:02', '...')
insert into @t values ( 6,3,1,'2000-1-1 10:00:04', '...')
insert into @t values ( 7,1,3,'2000-1-1 10:00:07', '...')
insert into @t values ( 8,1,2,'2000-1-1 10:00:13', '...')
insert into @t values ( 9,2,1,'2000-1-1 10:00:14', '...')
insert into @t values (10,1,2,'2000-1-1 10:00:20', '...')
insert into @t values (11,2,3,'2000-1-1 10:00:00', '...')
insert into @t values (12,1,4,'2000-1-1 10:00:10', '...')
insert into @t values (12,5,1,'2000-1-1 10:00:20', '...')

select t0.*
from
(
	select isnull(to_id, from_id) as userid,
		case when to_id is not null and from_id is not null and t0.d > t1.d then t0.d
			 when to_id is not null and from_id is not null and t0.d < t1.d then t1.d
			 when to_id is not null and from_id is null then t0.d
			 when to_id is null and from_id is not null then t1.d
		else null end as date,
		case when to_id is not null and from_id is not null and t0.d > t1.d then 1
			 when to_id is not null and from_id is not null and t0.d < t1.d then 2
			 when to_id is not null and from_id is null then 1
			 when to_id is null and from_id is not null then 2
		else null end as S
	from
		(
		select to_id, max(send_date) as d, 1 as s
		from @t
		where from_id = 1
		group by to_id
		) as t0
		full outer join 
		(
		select from_id, max(send_date) as d, 2 as s
		from @t
		where to_id = 1
		group by from_id
		) as t1
		on t0.to_id = t1.from_id
) as T
inner join @t t0 on T.date=t0.send_date and 
T.userid=case S when 1 then t0.to_id
		when 2 then t0.from_id end

robilem testy na ms sql server, dlatego uzycie zmiennej tabelarycznej, zasta ja zwykla tabela i bedzie ok
moza ewentualnie pomyslec nad uzyciem rank

1 użytkowników online, w tym zalogowanych: 0, gości: 1