Autor Zpráva
lionel messi
Profil
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
Toto asi nebude riesenie, ktore potrebujes SELECT * FROM tabulka_1 WHERE email='mandelinka@zemiakova.sk' ORDER BY RAND() LIMIT 1
Firibix
Profil
Reakce na lionela messiho:
SELECT * FROM tovary GROUP BY mail; by mělo fungovat.
anonym_
Profil *
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
SELECT max(tovar), mail FROM tovary GROUP BY mail
tttttttt
Profil *
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
Ďakujem za odpovede, použil som [#5].

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:

0