Autor | Zpráva | ||
---|---|---|---|
xmark Profil |
#1 · Zasláno: 27. 7. 2010, 16:00:45 · Upravil/a: xmark
Řekněme, že mám seznam firem (jedna tabulka) a seznam jejich adres (druhá tabulka, připojovaná JOINem).
Chtěl bych výpis firem i s adresami, stránkovaný po deseti firmách. Šel jsem na to tak, že jsem vzal tabulku firem, join tabulka adres a tabulku ve stylu jedna firma, x adres skládal v php. V sql byl výpis všeho a když se ID firmy = minulému ID firmy, je to jen nová adresa, tudíž ne nový řádek. Teď mi ale došlo, že mi nebude sedět stránkování. Má to řešení? |
||
Kcko Profil |
#2 · Zasláno: 27. 7. 2010, 16:15:05
Použil bych ještě 1 dotaz navíc na zjištění počtu firem. Tj. něco jako
SELECT DISTINCT firma FROM [table] pak budeš přesně vědět kolik je "záznamů", které chceš stránkovat. |
||
tiso Profil |
#3 · Zasláno: 27. 7. 2010, 16:16:00
xmark: čo znamená „že mi nebude sedět stránkování“?
|
||
Kcko Profil |
#4 · Zasláno: 27. 7. 2010, 16:20:29
tiso:
Jestli jsem to dobře pochopil tak je to myšleno takto Firma 1 - adresa 1 - adresa 2 Firma 2 - adresa 1 - adresa 2 - adresa 3 atd. Variabilní počet adres u každé firmy. A on chce stránkovat po každé 10 firmě a jelikož je počet adres u firmy různorodý, tak mu to nebude sedět. A ted když na to koukám, tak jsem mu neporadil nic, co by mu pomohlo. |
||
Kcko Profil |
#5 · Zasláno: 27. 7. 2010, 16:24:24 · Upravil/a: Kcko
Tak pokud těch záznamů nebude hodně tak bych to uložil do dvojrozměrného pole ..
dotaz while() { $zaznamy[$firma][] = $adresa; } Firmy pak nastránkuješ vcelku snadnou podmínkou, resp. podmínkami a vypíšeš cyklem a adresy si k tomu vypíšeš dalším vnořeným cyklem. |
||
xmark Profil |
#6 · Zasláno: 27. 7. 2010, 16:25:53
tiso:
Vzhledem k tomu, že ve výpisu budou všechny dvojice firma-adresa, které tam mají být, nebude ve vybraných deseti řádcích deset firem. Kcko: Rozumím, jen nevím, jak tím distinct výsledkem filtrovat ten druhý select. Už mě napadlo i to, že bych nejdřív vytáhl vybranou desítku IDfirmy do pole, pak z toho v php sestrojit druhý dotaz, kde bude výpis, který píšu v #1, ale bez LIMITu, zato s WHERE IDfirmy IN (1,2,3, ...) Jen mně to nepřipadá úplně nejčistší. |
||
Kcko Profil |
#7 · Zasláno: 27. 7. 2010, 16:28:29
xmark:
Stačí Ti: - 1x SQL dotaz - uložení do 2 rozm. pole, viz výše - vypsání dat ve 2 cyklech + udělat si stránkování. Počet záznamů (tedy to kolik je firem zjistíš snadno ne?) To je myslím vše :-) |
||
xmark Profil |
#8 · Zasláno: 27. 7. 2010, 16:33:25
Kcko:
Tak teď jde o to, jestli bude úspornější vytáhnout všechny firmy a jejich adresy a výpis dané stránky spočítat na úrovni php, nebo dva SQL dotazy, ale míň vytahovaných dat a míň práce v php :-) Přesto mám ale pocit, že to je tak nějak levou nohou za pravým uchem a za chvilku se tady objeví někdo a napíše něco, po čem se plácnu do čela. |
||
Kcko Profil |
#9 · Zasláno: 27. 7. 2010, 16:38:13
xmark:
1 nebo 2 dotazy tady nepomůžou. Ty potřebujes znát celkový počet firem (a to je jedno jestli to zjistíš dotazem navíc nebo k tomu dojde při přeuložení všech záznamů do pole) a poté k nim vypsat firmy. A ty firmy musíš mít taky uložené, nemůžeš to vypsat z fleku. V DIBI je nějaký iterátor, který umí přeškakovat řádky s offsetem, ale to Ti taky moc nepomůže. Nenapadá mně nic jiného, pak už jen aby se nemuselo šachovat s daty v PHP tak 1x SQL dotaz na firmy a pak na každou firmu dotaz v cyklu (kvůli adresám). To ale zase bude zbytečně moc dotazů. Tak uvidíme co ostatní. |
||
tiso Profil |
#10 · Zasláno: 27. 7. 2010, 16:39:56
xmark: „… nebude ve vybraných deseti řádcích deset firem.“
A čo tam bude? 10 adries a k nim prislúchajúce firmy? |
||
xmark Profil |
#11 · Zasláno: 27. 7. 2010, 16:42:49
tiso:
fa1-adr1 fa1-adr2 fa1-adr3 fa2-adr1 fa2-adr2 fa3-adr1 fa4-adr2 fa4-adr3 fa4-adr4 fa4-adr5 |
||
xmark Profil |
#12 · Zasláno: 27. 7. 2010, 16:54:13 · Upravil/a: xmark
Kcko:
1. vytáhnu si z tabulky firem požadovanou desítku ID na základě LIMIT 2. z těch deseti ID udělám v php toto "(1,2,4,6,11,16,17,18,23,30)" 3. sestrojím hlavní dotaz SELECT * from firmy LEFT JOIN adresy on adresy.IDfirmy = firmy.ID WHERE firmy.ID IN (1,2,4,6,11,16,17,18,23,30) 4. Vypíšu (neznámý) počet řádků a u každého pohlídám, jestli se IDfirmy rovná IDfirmy z minulého průchodu. Pokud ne, jde o novou firmu pokud ano, je to jen adresa stejné firmy (opravte mě kdokoliv, jestli melu nesmysly) //opraveno, byly tam chyby, hlava je rychlejší než ruce |
||
Kcko Profil |
#13 · Zasláno: 27. 7. 2010, 16:57:35
xmark:
No vidíš, šikovný chlapec tohle rešení mě nenapadlo. 3/ Hlavní dotaz a jeho výsledky uložíš do pole kde klíč bude firma a poté to už jen vypíšeš. |
||
Kajman_ Profil * |
#14 · Zasláno: 27. 7. 2010, 16:59:00
Nebo dát limit do poddotazu.
select * from (select na firmy s limit) f join adresy a on ... |
||
tiso Profil |
#15 · Zasláno: 27. 7. 2010, 17:08:46 · Upravil/a: tiso
xmark: aha, ty si v [#6] písal o riadkoch z databázy.
Buď to spravíš tak, ako si si to napísal v [#12] (len si upravíš where na: WHERE firmy.ID IN (1,2,3,4,5,6,7,8,9,10)
alebo to spravíš jedným dotazom (ale pekné to nebude): SELECT … FROM (SELECT ID FROM firmy LIMIT offset, limit) sub JOIN firmy on sub.ID=firmy.ID LEFT JOIN adresy on firmy.ID=adresy.IDfirmy |
||
xmark Profil |
#16 · Zasláno: 27. 7. 2010, 17:09:51
Díky za spolupráci, pánové :)
|
||
xmark Profil |
#17 · Zasláno: 27. 7. 2010, 17:11:37
tiso:
Pravda, já jsem motal řádky a řádky, příště budu formulovat precizněji. Díky. |
||
Časová prodleva: 14 let
|
0