Autor Zpráva
Sylar
Profil
Zdravím,
lámu si hlavu nad jedním dotazem, základem je toto:

SELECT nazev, count(DISTINCT shop) AS shopu, MIN(cena) AS cena_min, MAX(cena) AS cena_max, img, manufacturer, ean, productno FROM ?_shops_produkty WHERE new_item = '1' AND nazev != '' GROUP BY nazev HAVING count(DISTINCT shop) >= 5 ORDER BY count(DISTINCT shop) LIMIT 0, 500

dotaz vybírá produkty, které jsou ve více než pěti obchodech a grupuje je dle názvu těch produktů. Potřeboval bych aby je grupoval navíc grupoval i podle sloupců manufacturer, ean a productno. Tzn. jako jeden produkt se mi zobrazí např. produkt s názvem "Produkt 1", názvem výrobce "Výrobce", EAN kódem "161351" a produktovým číslem "161351" a jako druhý produkt se mi zobrazí "Produkt 1", "Výrobce", EAN kódem "161351" a produktovým číslem "161352". Nyní, když se produkty grupují pouze dle názvu, by se tyto dva produkty zobrazily jako jeden.
Nenapadá mne bohužel jak na to. Když přidám GROUP BY nazev AND manufacturer AND ... atd není to to, co potřebuji ...

====
Ještě jeden menší dotaz:

Existuje v mysql podobná funkce MIN/MAX pro stringy? Tedy vybrání nejdelšího nebo naopak nejkratšího stringu?
Kajman
Profil
GROUP BY dle více sloupců
GROUP BY nazev, manufacturer, ean,  productno

Případně můžete k tomuto dotazu přilinkovat všechny produkty s tímto opakujícím se názvem. Těžko říct, co chcete.

I v order by pak můžete použít všechny tyto sloupce oddělené čárkou.

Tedy vybrání nejdelšího nebo naopak nejkratšího stringu?

Taková agregační funkce asi nachystaná není. Můžete si spočíta max(length(string)) a pak si připojit řádky s touto délkou, ale jednoduché a rychlé to nebude.
Sylar
Profil
Kajman:
toto jsem již zkoušel, jen nad špatnými daty v databázi, toho jsem si nevšiml, proto mi to nefungovalo. děkuji

klauzule order by je zde spíš jen proto, aby se předně zpracovaly položky, které jsou tam nejvíce krát, jinak tam konec konců ani být nemusí

ano, podobné návody jsem pročítal, nicméně muselo by to vypadat nějak podobně
select description, max(length(description)) as delka from table where delka = length(description)
a já těch sloupců "description" mám více a moje myšlenka byla vybrat vždy nejdelší description ze všech sloupců, ale v praxi by se klidně mohlo stát, že nejdelší description1 bude v jednom řádku, nejdelší description2 bude na jiném a to mi výše popsané řešení bohuel nedovoluje ...
Kajman
Profil
Sylar:
muselo by to vypadat nějak podobně

Kdepak, takhle to nebude fungovat.

Spíše tu bude něco jako

SELECT p.nazev,
       p.description
FROM   produkty p
       JOIN (SELECT nazev,
                    Max(Length(description)) AS delka
             FROM   produkty
             GROUP  BY nazev) d
         ON p.nazev = d.nazev
            AND Length(p.description) = d.delka 

Ale bude to pomalé jak šnek. Rychlejší bude, když si tu délku předpočítáte při každé její změně. Případně si označíte řádky, které jsou hlavní. Nebo si rovnou upravíte struktury tak, aby se jednoduše rozlišovalo mezi hlavním produktem a jeho variantou.
Sylar
Profil
Kajman:
asi nejjednoduší by bylo, jak píšete, upravit strukturu, např. při zakládání nového produktu rovnou změřit délku description a uložit to do dalšího sloupce ... pak už je jednoduché vybrat ten nejdelší ... asi to tak udělám
děkuji za rady

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: