Autor Zpráva
Vitajs
Profil *
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
Možná půjde něco jako
group by least(odesilatel,prijemce), greatest(odesilatel,prijemce)
Ale může to neblaze ovlivnit rychlost, tak by možná bylo lepší udělat group by odesilatel, prijemce a až toto obalit tímto group by pro sjednocení.
Vitajs
Profil *
Funguje to, ale neřadí se to podle data
Kajman
Profil
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.
Vitajs
Profil *
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
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 *
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'
ale vybralo to jen záznamy kde 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 

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: