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 |
#2 · Zasláno: 5. 4. 2012, 21:57:18
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 |
#3 · Zasláno: 5. 4. 2012, 22:24:10
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) |
||
Kajman Profil |
#4 · Zasláno: 6. 4. 2012, 09:15:06
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 |
#5 · Zasláno: 6. 4. 2012, 10:43:18
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 |
||
Časová prodleva: 12 let
|
0