MySQL: DISTINCT 2 rows...
 
blackmamba 20. nov 2012 18:19:30 Pridružen od:
4. mar 2008
559 objav
392 25 11
#11

Kaj pa to? :)


SELECT
IF(from_user>to_user, from_user, to_user) AS user1,
IF(from_user>to_user, to_user, from_user) AS user2,
`date`
FROM `zasebna_sporocila`
GROUP BY user1, user2
ORDER BY `date` DESC

EDIT:

namesto IF-ov lahko uporabiš


GREATEST(from_user, to_user) AS user1,
LEAST(from_user, to_user) AS user2,
všeč(0) ni všeč(0) spam(0)
 
Lucifix 20. nov 2012 20:19:11 Pridružen od:
14. okt 2008
744 objav
438 12 0
#12

@blackmamba tudi o tem sem že razmišljal, ampak v tvojem primeru bi moral nekam še vstavit user id spremljivko, ki je vezana na določenega člana.


všeč(0) ni všeč(0) spam(0)
 
Lucifix 20. nov 2012 20:25:04 Pridružen od:
14. okt 2008
744 objav
438 12 0
#13

@Vini:


Poizvedba je potem enostavna:
SELECT
zasebna_sporocila.*
FROM
zasebna_sporocila_pomozna,
zasebna_sporocila
WHERE
zasebna_sporocila_pomozna.user_id = 1 AND
zasebna_sporocila.id = zasebna_sporocila_pomozna.sporocilo_id
ORDER BY
zasebna_sporocila_pomozna.datum;

Tvoja koda potem vrne rezultate v tabeli, ki so vezane na uporabnika z recimo ID št. 1. Ampak s tem še ne dobim groupiranih / unikatnih poizvedb.



Primer:

dva uporabnika, eden z ID 1 in drug z ID 2, se med sabo dopisujete. Potem si dopusujeta še uporabnika z ID 1 in ID 3. In pa recimo up. ID 2 z up. ID 3.



Ker sem recimo jaz up. ID 1, želim dobite en rezultat id 1 & id 2, ter id 1 & id 3. Razmerje med ID 2 in ID 3 me pač ne "zanima", ker so pač zasebna sporočila.



Uf kako bi to bilo lažje obrazložiti v živo :)


všeč(0) ni všeč(0) spam(0)
 
Lucifix 20. nov 2012 20:41:45 Pridružen od:
14. okt 2008
744 objav
438 12 0
#14

Saj zdaj razmišljam, da je najlažje pogledati primer kar na FB strani:

https://www.facebook.com/messages/ (leva stran, kjer se nahajajo vsa sporočila med uporabniki)


všeč(0) ni všeč(0) spam(0)
 
Vini 20. nov 2012 22:30:38 Pridružen od:
1. sep 2006
6612 objav
5234 611 56
#15

Lucifix, imaš prav, seveda, moja napaka. Potrebuješ dve ID polji, v kateri zapišeš oba IDja v dva zapisa, enkrat fromuser v prvi ID, touser v drugi ID, v drugi zapis pa ravno obratno.


všeč(0) ni všeč(0) spam(0)
 
blackmamba 21. nov 2012 00:20:24 Pridružen od:
4. mar 2008
559 objav
392 25 11
#16

Način brez dodatne tabele. Vsi zadnji chati userja id=123, pogrupirani, sortirani po datumu.



V rezultatu "user1" je vedno userid=123, v "user2" je pa userid tistega s katerim je chatal.



Sporoči koliko časa se query izvaja in EXPLAIN.


SET @user_id = 123;

SELECT
IF(from_user = @user_id, from_user, to_user) AS user1,
IF(from_user = @user_id, to_user, from_user) AS user2,
`date`
FROM `zasebna_sporocila`
WHERE from_user=@user_id OR to_user=@user_id
GROUP BY user1, user2
ORDER BY `date` DESC;
všeč(0) ni všeč(0) spam(0)
 
blackmamba 21. nov 2012 00:39:23 Pridružen od:
4. mar 2008
559 objav
392 25 11
#17

EDIT: moja rešitev ni ravno hitra, če je veliko podatkov, dela pa.



Uporabi raje Vinijevo rešitev :)


všeč(0) ni všeč(0) spam(0)
 
Lucifix 22. nov 2012 13:25:09 Pridružen od:
14. okt 2008
744 objav
438 12 0
#18

Jao kaj so delali s strukturo tabel v sistemu phpBB2?!?! Ko nekdo dobi ZS, se ustvari nova vrstica samo za pošiljatelja - ala sent message. Groza za programiranje...



Hvala še 1x vsem za pomoč, ampak tokrat bom pa vrgel puško v koruzo in začel s čim bolj produktivnim :/


všeč(0) ni všeč(0) spam(0)
 
ernest1a 24. nov 2012 11:58:51 Pridružen od:
27. feb 2007
335 objav
172 8 1
#19

Ravno zadnjič sem nekaj podobnega delal. Torej PM sistem na podoben način kot ima FB. Nisem prebral vseh sporočil, vendar na kratko jaz bi dodal še eno polje thread_id.


všeč(0) ni všeč(0) spam(0)
 
jurij123 24. nov 2012 18:05:39 Pridružen od:
20. nov 2010
572 objav
675 148 10
#20

Hmm nevem zakaj ne das index na from, to, in id.



In potem samo simple poizvedba



SELECT * FROM sporocila WHERE sporocila.to = 3 OR sporocila.from = 3 ORDER BY sporocila.id DESC



3 = id trenutno prijavlenega uporabnika.


všeč(0) ni všeč(0) spam(0)
 
 

🔒 Za odgovor na to temo se moraš prijaviti.

Prijavi se