Autor Zpráva
capricorn
Profil
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
http://php.vrana.cz/maximalni-delka-group_concat.php
capricorn
Profil
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
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
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
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 *
Proč to neseskupíte až v aplikační logice?
capricorn
Profil
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
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
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
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
koukni na opravu, poslal sem jeste jednu verzi ktera by mela odstranit.
SUM() / COUNT() spatne sem pochopil co chces :)
capricorn
Profil
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
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
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
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
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
Jestli sem to pochopil tak potrebujes najit v kolika kategoriich je ten vyrobek?
capricorn
Profil
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
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
bohyn

Porad to nespocita to, co ma. :-( Sloupec "soucet" obsahuje porad 1, ale obsahovat ma napr. 7, 2 atd.
bohyn
Profil
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
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
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 |
capricorn
Profil
Tak jsem to vyresil, stacilo pouzit podminky.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0