Autor | Zpráva | ||
---|---|---|---|
lionel messi Profil |
#1 · Zasláno: 23. 11. 2020, 16:17:13
Zdravím,
mám tabuľku: tovar | mail _____________ zemiaky | mandelinka@zemiakova.sk reďkovka | mandelinka@zemiakova.sk kapusta | bob@bobek.sk šalát | bob@bobek.sk mrkva| bob@bobek.sk Potrebujem z nej vybrať tovar aj mail, pričom pre každý mail sa má vrátiť práve jeden riadok. Je pritom úplne jedno, ktorý tovar sa vráti. Skúšal som select distinct aj group by, ale vždy mi vrátilo všetky riadky s tovarom aj mailom, alebo iba maily, lenže potrebujem aj tovary. Vopred ďakujem za odpoveď. |
||
tomix Profil |
#2 · Zasláno: 23. 11. 2020, 17:01:09
Toto asi nebude riesenie, ktore potrebujes
SELECT * FROM tabulka_1 WHERE email='mandelinka@zemiakova.sk' ORDER BY RAND() LIMIT 1
|
||
Firibix Profil |
#3 · Zasláno: 23. 11. 2020, 17:44:44
|
||
anonym_ Profil * |
#4 · Zasláno: 23. 11. 2020, 19:14:56
tomix:
„Toto asi nebude riesenie, ktore potrebujes“ Přemýšlím, proč to tedy píšeš, když víš, ze to je nesmysl. lionel messi Druhá možnost je distinct, pokud potřebuješ jen ty mailové adresy. SELECT distinct(mail) FROM tovary |
||
Kajman Profil |
#5 · Zasláno: 23. 11. 2020, 21:44:22
SELECT max(tovar), mail FROM tovary GROUP BY mail |
||
tttttttt Profil * |
#6 · Zasláno: 23. 11. 2020, 23:40:33
V PostgreSQL pak
SELECT DISTINCT ON(mail) mail, tovar FROM tovary
|
||
Keeehi Profil |
lionel messi:
V MySQL bude fungovat to co píše Firibix protože v jednom jejím módu , když nemáš definovanou agregační funkci nad sloupcem, tak prostě vrátí jednu hodnotu z něho. Osobně mi to ale přijde špinavé a tak dotazy píšu v módu ONLY_FULL_GROUP_BY. Tam je nutné nějakou agregační funkci použít. Přesně tak, jak píše Kajman. Jednoduché je použít MIN nebo MAX. Nebo by mělo jít pomocí JSON_ARRAYAGG všechny hodnoty sloučit do pole a pomocí JSON_EXTRACT s toho vytáhnout jednu hodnotu. Ovšem předpokládám, že kvůli konverzi na JSON a zpět to nebude výkonově nic moc. Pokud to je MariaDB a ne MySQL dá se vytvořit vlastní agregační funkce (CREATE AGGREGATE FUNCTION). No a další možností je použít window funkce. SELECT tovar, mail FROM ( SELECT tovar, mail, ROW_NUMBER() OVER (PARTITION BY mail) AS rn FROM tovary ) t WHERE t.rn = 1 nebo SELECT DISTINCT FIRST_VALUE(tovar) OVER (PARTITION BY mail) AS tovar, mail FROM tovary Těch možností je spousta. |
||
lionel messi Profil |
#8 · Zasláno: 24. 11. 2020, 14:41:18
Ďakujem za odpovede, použil som [#5].
|
||
Časová prodleva: 3 roky
|
0