Autor | Zpráva | ||
---|---|---|---|
Vitajs Profil * |
#1 · Zasláno: 15. 3. 2012, 12:32:15
Dobrý den, potřeboval bych pomoc s dotazem, který má vybrat pouze jeden nejnovější unikátní záznam řazený podle data sestupně.
Tabulka vypadá takto ID | odesilatel | prijemce | datum | zprava ------------------------------------------- 1 | tomas | petr | 15.3.2012 | zprava 2 | petr | tomas | 16.3.2012 | zprava 3 | tomas | josef | 14.3.2012 | zprava 4 | tomas | petr | 17.3.2012 | zprava 5 | petr | tomas | 10.3.2012 | zprava GROUP BY i DISTINCT vyberou jen tohle ID | odesilatel | prijemce | datum | ------------------------------------------- 4 | tomas | petr | 17.3.2012 2 | petr | tomas | 16.3.2012 3 | tomas | josef | 14.3.2012 ale mým cílem je vyhodit ID 2 protože (tomas a petr) a (petr a tomas) je to samé a vybrat jen toto: 4 | tomas | petr | 17.3.2012 3 | tomas | josef | 14.3.2012 |
||
Kajman Profil |
#2 · Zasláno: 15. 3. 2012, 12:46:18
Možná půjde něco jako
group by least(odesilatel,prijemce), greatest(odesilatel,prijemce) |
||
Vitajs Profil * |
#3 · Zasláno: 15. 3. 2012, 14:30:55
Funguje to, ale neřadí se to podle data
|
||
Kajman Profil |
#4 · Zasláno: 15. 3. 2012, 14:36:56
To samo o sobě mysql neumí. Předchozí group by Vám to taky asi nedělal. Musíte si k té kombinaci nalézt maximum a to teprve hledat znovu v řádích viz. faq.
Pokud by se hledalo maximální id pro kombinaci, tak to bude jednodušší, pri hledani podle sloupce datum ty vazební podmínky musí zohlednit to použití least a greatest. |
||
Časová prodleva: 3 měsíce
|
|||
Vitajs Profil * |
#5 · Zasláno: 13. 6. 2012, 17:30:17
Tak podle toho, co jste mi poradili, jsem měl tento dotaz:
SELECT * FROM (SELECT * FROM zpravy WHERE prijemce = '$uzivatel' OR odesilatel = '$uzivatel' GROUP BY prijemce,odesilatel) AS z group by greatest(odesilatel,prijemce), least(odesilatel,prijemce) ORDER BY z.id DESC LIMIT $alt,$max Ten dotaz fungoval, ale teď se objevil problém - vybírá mi to první zprávu, ne poslední, takže když mám dotaz SELECT * FROM zpravy WHERE prijemce = '$uzivatel' OR odesilatel = '$uzivatel' GROUP BY prijemce,odesilate ORDER BY id DESC a tabulku id | odesil. | prij. | zprava 1 | tomas | petr | aaa 2 | petr | tomas | bbb 3 | tomas | petr | ccc 4 | petr | tomas | ddd tak vybere id 1 a 2, ale potřebuji aby to vybralo id 3 a 4. Dá se to nějak seřadit ještě před tím group by? |
||
Keeehi Profil |
DESC => ASC - obrací to řazení (od největšího k nejmenšímu)
|
||
Kajman Profil |
#7 · Zasláno: 13. 6. 2012, 17:37:01
Vitajs:
„ale potřebuji aby to vybralo id 3 a 4“ Použijte max(id) a k takto vzniklému id ještě jedním spojedním přiřaďte odpovídající zprava. |
||
Vitajs Profil * |
#8 · Zasláno: 13. 6. 2012, 17:39:11 · Upravil/a: Vitajs
S ASC to taky nefunguje.
A kam mám to max(id) v tom původním dotazu zařadit? Zkoušel jsem SELECT * FROM zpravy WHERE id = (SELECT MAX(id) FROM zpravy) AND prijemce = '$uzivatel' OR odesilatel = '$uzivatel' |
||
Kajman Profil |
Vitajs:
„A kam mám to max(id) v tom původním dotazu zařadit?“ Koukal jste se do faq odkazované z [#4]? Musíte sestavit něco takového... SELECT z.* FROM (SELECT Max(id) id FROM (SELECT Max(id) id, prijemce, odesilatel FROM zpravy WHERE prijemce = '$uzivatel' OR odesilatel = '$uzivatel' GROUP BY prijemce, odesilatel) AS x GROUP BY Greatest(odesilatel, prijemce), Least(odesilatel, prijemce)) m JOIN zpravy z ON m.id = z.id ORDER BY z.id DESC |
||
Časová prodleva: 12 let
|
0