Autor | Zpráva | ||
---|---|---|---|
capricorn Profil |
#1 · Zasláno: 2. 11. 2008, 12:56:29
Zdravim, potrebuji seskupit velke mnozstvi dat do jednotlivych radku, ale do budoucna se bojim, ze funkce group_concat na to uz nebude stacit, protoze ma urcite omezeni. Existuje na seskupovani velkeho poctu dat nejaka jina funkce, ktera nema omezeni?
|
||
Kcko Profil |
#2 · Zasláno: 2. 11. 2008, 18:24:31
|
||
capricorn Profil |
#3 · Zasláno: 3. 11. 2008, 15:31:44
A hodi se vubec da funkce pro velky objem dat? Z me pohledu jako laika je to docela silenost, aby jeden radek obsahoval retezec napr. 60 000 znaku.
|
||
bohyn Profil |
#4 · Zasláno: 3. 11. 2008, 17:48:34
Ses si jistej ze vubec potrebujes seskupovat spoustu dat timhle zpusobem (obzvlast kdyz ted sam nevis kolik toho bude)? Neda se to treba vyresit poddotazem?
|
||
capricorn Profil |
#5 · Zasláno: 3. 11. 2008, 19:14:31
bohyn
Ses si jistej ze vubec potrebujes seskupovat spoustu dat timhle zpusobem (obzvlast kdyz ted sam nevis kolik toho bude)? Jsem na na 100% jisty, ze potrebuji timto zpusobem seskupit velky objem dat. Neda se to treba vyresit poddotazem? Samotnym poddotazem by se to dalo resit, ale tim padem polozim celem tri dotazy misto dvou. Docela je to skoda, ze ta funkce ma urcite omezeni. |
||
bohyn Profil |
#6 · Zasláno: 3. 11. 2008, 20:24:47
„Samotnym poddotazem by se to dalo resit, ale tim padem polozim celem tri dotazy misto dvou.“
1) Tri dotazy muzou byt rychlejsi nez dva a nebudes omezen velikosti dat. 2) Seskupovat 60K znaku je fakt docela brutalni. Pokud je to script v admin skeci (spousti jednou za cas) tak by to mohlo byt jeste OK, pokud je to verejny script (treba na kazdy strance) tak by te taky mohli vystehovat z hostingu ;) 3) Co pouziti vice tabulek? nevim na co to potrebujes takze tezko radit neco konkretnejsiho. |
||
Kajman_ Profil * |
#7 · Zasláno: 4. 11. 2008, 10:18:08
Proč to neseskupíte až v aplikační logice?
|
||
capricorn Profil |
#8 · Zasláno: 4. 11. 2008, 16:46:15
Abych mohl vsechno seskupit az v aplikacni logice, tak bych potreboval pomoct s nize uvedenym dotaz, protoze ja uz jsem bezradny.
$sql = "SELECT t1.*, t2.* FROM (SELECT p1.id_category, p1.name, p1.seo FROM category AS p1 ) AS t1 INNER JOIN (SELECT p2.id_category, p2.id_goods FROM goods AS p2 WHERE p2.id_category = $id ) AS t2 ON t1.id_category = t2.id_category INNER JOIN (SELECT p3.id_goods FROM price_goods AS p3 GROUP BY p3.id_goods ) AS t3 ON t2.id_goods = t3.id_goods ORDER BY t1.name ASC"; Potreboval bych, aby se spocitaly hodnoty ve sloupci id_category vytvorene tabulky t2, za podminky, ze id_goods je v tabulce price_goods. Pokud by slo, tak bych potreboval doplnit LIMIT do vytvorene tabulky t2 za podminky, ze se nezmeni ten soucet hodnot. Ten LIMIT tam potrebuji z toho duvodu, abych nemusel polozit dalsi dotaz a tahat velky objem dat pres IN(). |
||
bohyn Profil |
#9 · Zasláno: 4. 11. 2008, 17:18:44
Je to asi spis nastineni reseni, ale neslo by takhle?
$sql = "SELECT category.id_category AS id1, category.name, category.seo, goods.id_category AS id2, SUM(goods.id_category) AS soucet, goods.id_goods FROM price_goods, category JOIN goods ON category.id_category = goods.id_category WHERE goods.id_goods = price_goods.id_goods ORDER BY category.name ASC"; |
||
bohyn Profil |
#10 · Zasláno: 4. 11. 2008, 17:44:31 · Upravil/a: bohyn
Nebo mozna spis jeste:
$sql = "SELECT category.id_category AS id1, category.name, category.seo, goods.id_category AS id2, goods.id_goods, (SELECT COUNT(goods.id_category) FROM goods, price_goods WHERE goods.id_goods = price_goods.id_goods GROUP BY price_goods.id_goods) AS soucet FROM price_goods, category JOIN goods ON category.id_category = goods.id_category ORDER BY category.name ASC"; Edit: SUM() -> COUNT() a pridano GROUP BY |
||
capricorn Profil |
#11 · Zasláno: 4. 11. 2008, 18:12:21 · Upravil/a: capricorn
bohyn
Asi jsem se spatne vyjadril, ale potrebuji pocet hodnot ve sloupci, t.j. misto SUM() ma byt COUNT(). A jinak to pocita vsechny id_goods z tabulky price_goods, protoze je tam stejny id_goods vice, takze se musi pouzit GROUP BY price_goods.id_goods, ale to hodi chyby #1242 - Subquery returns more than 1 row EDIT: A ted jsem si vsimnul, ze se zobrazi i radky, ktere nemaji v tabulce price_goods zadny zaznam. |
||
bohyn Profil |
#12 · Zasláno: 4. 11. 2008, 18:26:17
koukni na opravu, poslal sem jeste jednu verzi ktera by mela odstranit.
SUM() / COUNT() spatne sem pochopil co chces :) |
||
capricorn Profil |
#13 · Zasláno: 4. 11. 2008, 18:49:54 · Upravil/a: capricorn
bohyn
Asi tam bude neco spatne, protoze ani za 1 minutu to nevyplyvlo zadny vysledek. Asi to dela to, ze 18 radku tabulky goods se spojuje s 650 484 radky z tabulky price_goods, potom podminka a group. EDIT: Ono se pocita, kolik id_goods je v tabulce price_goods, ale ma to bych obracene, kolik stejnych id_category je v tabulce goods za podminky, ze id_goods ma alepson jeden radek v tabulce price_goods |
||
bohyn Profil |
#14 · Zasláno: 4. 11. 2008, 19:05:24
Nespojuje, mas tam indexy na `goods.id_goods`, `price_goods.id_goods`, `category.id_category` a `goods.id_category`? S indexem by to melo byt rychle.
a vyhod z hlavniho dotazu FROM price_goods, to sem tam zapomel. Mozna dela bordel to. |
||
capricorn Profil |
#15 · Zasláno: 4. 11. 2008, 19:22:21
bohyn
Ano mam vsude indexy. Musi to byt nejprve: SELECT goods.id_goods FROM goods INNER JOIN price_goods ON goods.id_goods = price_goods.id_goods GROUP BY goods.id_goods Ale rychlejsi by bylo spojit s tabulkou goods - tabulku price_goods jiz zgroupovanou, jak ja to mam v tom dotazu. A az teprve potom se musi tabulka vytvorena spojenim tabulky goods a price_goods spojit s tabulkou goods a teprve potom se muze pocitat sloupec goods.id_category. Nebo tak nejak, uz mne z toho hrabe. ;-) |
||
bohyn Profil |
#16 · Zasláno: 4. 11. 2008, 19:34:46
Ten subdotaz ze samozrejme grupuje jeste pred spojenim s dalsima tabulkama. Mozna jeste dela bordel v subtodatazu ze se pouzivaji stejny jmena tabulek jako v hlavnim.
$sql = "SELECT category.id_category AS id1, category.name, category.seo, goods.id_category AS id2, goods.id_goods, (SELECT COUNT(sub_goods.id_category) FROM goods AS sub_goods, price_goods AS sub_price WHERE sub_goods.id_goods = sub_price.id_goods GROUP BY sub_price.id_goods) AS soucet FROM category JOIN goods USING(id_category) ORDER BY category.name ASC"; |
||
capricorn Profil |
#17 · Zasláno: 4. 11. 2008, 19:54:11 · Upravil/a: capricorn
bohyn
Spatne to porad chapes, vysvetlim to na prikladu. Mam tabulky, category, goods, price_goods. Tabulka category: id_category | name | 1 | nejaka kategorie | Tabulka goods: id_goods | id_category | 1 | 1 | Tabulka price_goods id_goods | price | date| 1 | 1.00 | 2008-11-04 | 1 | 2.50 | 2008-10-04 | 1 | 10.00| 2008-11-03| A ja potrebuji tento vysledek: id_category | name_category | pocet | 1 | nejaka kategorie | 1 | V nasem pripade ten dotaz vraci, spatny vysledek: id_category | name_category| pocet| 1 | nejaka kategorie | 3 | EDIT: Ten priklad je jen na ten vypocet, na nic jineho, proto tady nektere sloupce nejsou, ktere jsou v tech dotazech. |
||
bohyn Profil |
#18 · Zasláno: 4. 11. 2008, 20:06:50
Jestli sem to pochopil tak potrebujes najit v kolika kategoriich je ten vyrobek?
|
||
capricorn Profil |
#19 · Zasláno: 4. 11. 2008, 20:20:03
Ano, ale za podminky, ze id_goods z tabulky goods ma alespon jeden zaznam v tabulce price_goods.
Napr. Pridam do tabulky goods radek: 2 | 1 | Tak vysledek musi byt porad 1| nejaka kategorie | 1 | protoze id 2 nema v tabulce price_goods zadny zaznam. |
||
bohyn Profil |
#20 · Zasláno: 4. 11. 2008, 20:46:22
Predpokladam za kazde goods musi mit nejakou category, takze to je pak jednoduchej select z vice tabulek
$sql = "SELECT category.id_category AS id1, category.name, category.seo, goods.id_category AS id2, goods.id_goods, (SELECT COUNT(category.id_category) FROM category WHERE category.id_category = goods.id_category GROUP BY category.id_category) AS soucet FROM category, goods, price_goods WHERE goods.id_category = category.id_category AND goods.id_goods = price_goods.id_goods ORDER BY category.name ASC"; goods ktere nemaji zadnou cenu nevyhovi podmince v hlavnim selectu. |
||
capricorn Profil |
#21 · Zasláno: 4. 11. 2008, 21:17:38
bohyn
Porad to nespocita to, co ma. :-( Sloupec "soucet" obsahuje porad 1, ale obsahovat ma napr. 7, 2 atd. |
||
bohyn Profil |
#22 · Zasláno: 4. 11. 2008, 21:26:50
To dela tohle: goods.id_category = category.id_category
Jaky mas vztah category -> goods? nebo mas goods id_goods | id_category | 1 | 1 | 1 | 2 | 1 | 3 | 2 | 2 | 2 | 4 | ? |
||
bohyn Profil |
#23 · Zasláno: 4. 11. 2008, 21:33:18
Jestli plati druha varianta zkus tohle:
$sql = "SELECT category.name, category.seo, goods.id_category, goods.id_goods, (SELECT COUNT(goods.id_category) FROM goods WHERE category.id_category = goods.id_category GROUP BY category.id_category) AS soucet FROM category, goods, price_goods WHERE goods.id_category = category.id_category AND goods.id_goods = price_goods.id_goods ORDER BY category.name ASC"; |
||
capricorn Profil |
#24 · Zasláno: 4. 11. 2008, 21:33:38
bohyn
Mam goods id_goods | id_category | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 2 | 5 | 4 | a price_goods id_goods | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | |
||
Časová prodleva: 3 dny
|
|||
capricorn Profil |
#25 · Zasláno: 7. 11. 2008, 16:39:16
Tak jsem to vyresil, stacilo pouzit podminky.
|
||
Časová prodleva: 15 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0