Autor Zpráva
xmark
Profil
Ř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
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
xmark: čo znamená „že mi nebude sedět stránkování“?
Kcko
Profil
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
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
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
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
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
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
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
tiso:

fa1-adr1
fa1-adr2
fa1-adr3
fa2-adr1
fa2-adr2
fa3-adr1
fa4-adr2
fa4-adr3
fa4-adr4
fa4-adr5
xmark
Profil
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
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 *
Nebo dát limit do poddotazu.

select * from
(select na firmy s limit) f
join adresy a on ...
tiso
Profil
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
Díky za spolupráci, pánové :)
xmark
Profil
tiso:
Pravda, já jsem motal řádky a řádky, příště budu formulovat precizněji. Díky.

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:

0