Autor | Zpráva | ||
---|---|---|---|
Jcas Profil |
#1 · Zasláno: 14. 3. 2016, 16:24:41
Zobrazení všeho potřebného (po rozkliknutí jednoho řádku) pro jednoho chovatele je jednoduché. to zvládnu. Ale mám problém se základním hromadným výběrem. Abych nevybíral miliony dat, ale zároveň získal stručný přehled.
1. Seznam chovatelů. Ve výsledku potřebuji řádek pro každého chovatele jeden řádek - USER.id - jmeno - prijmeni - ANO/NE (zvířata) - ANO/NE (inzeráty) To ano/ne znamená, že zatím nepotřebuji vědět jaké, ale pouze zda má nějaké uloženy, nebo ne. Je to 5 údajů, ale z mnoha tabulek a nevím jak na to, abych nevybíral téměř vše. 2.Seznam zvířat. Jiný dotaz, ale podobný. -zvirata.plemeno - USER.id - jmeno - prijmeni - město První problém na který narážím je, že mám mnoho zbytečných dat. A druhý je stránkování. Já si sice jednoduše udělám 0-30, 30-60 záznamů, ale když mám 0-30 pro jednoho chovatele. Pomůžete mi prosím. Data vybírám od Odtud |
||
juriad Profil |
SELECT u.id, j.hodnota, p.hodnota, # údaje o uživateli COALESCE(ch.cnt, 0) AS chovu, COALESCE(i.cnt, 0) AS inzeratu # počty chovů a inzerátů, 0 pokud nenalezen FROM user u LEFT JOIN used_data j ON u.id = j.id_user AND j.id_vlastnosti = 2 # dvojka je jmeno LEFT JOIN used_data p ON u.id = p.id_user AND p.id_vlastnosti = 3 # trojka je prijmeni LEFT JOIN ( # seskupíme chovy podle chovatele a spočítáme počet záznamů SELECT id_chovatel, COUNT(*) AS cnt FROM chovy GROUP BY id_chovatel ) ch ON u.id = ch.id_chovatel LEFT JOIN ( # seskupíme inzeráty podle chovatele a spočítáme počet záznamů SELECT id_ch, COUNT(*) AS cnt FROM inzeraty GROUP BY id_ch ) i ON u.id = i.id_ch Ty hodnoty 2 a 3 si budeš cachovat někde v PHP, zbavíš se tak dvou joinů na tabulku USER_vlastnosti. ANO/NE bych řešil až v PHP. Ono se ti může nakonec líbit třeba i zobrazit to číslo v závorce atp. Výkonostní rozdíl v tom není. |
||
Jcas Profil |
#3 · Zasláno: 14. 3. 2016, 21:30:01
Super, děkuji.
|
||
Jcas Profil |
#4 · Zasláno: 15. 3. 2016, 10:12:09
Právě jsem narazil na dvě věci, které jsem nepochopil už když jsem se učil základy.
1. Myslel jsem, že pokud za selectem jmenuji sloupce, tak musím napsat všechny sloupce, se kterými chci pracovat. Jako třeba zde mi chybí j.id_vlastnosti . (nebo jsem si zkusil přidat WHERE na sloupec, který taky není uveden a funguje. Evidentně se asi píše pouze to, co chci mít ve výsledku.
2. Zaráží mě kolaps jména sloupců(2*hodnota). Vždy se snažím mít jedinečné názvy, ale nyní jsem zmaten, jak je toto možné. A co to uděla v php, když si to pak budu házet do pole $pole['hodnota'] . Řešení je jasné SELECT u.id, j.hodnota AS jmeno, p.hodnota AS prijmeni . Ale akorát je jasné, že nechápu, proč zde kolaps jména není problém.
|
||
Kajman Profil |
#5 · Zasláno: 15. 3. 2016, 10:36:17
1. Za částí select se dávají sloupce, které chcete vypsat. Ve where části nebo order části můžete použít i jiné sloupce. Některé databáze vyžadují sloupce použité v group by umístit i do části select.
2. Pří výpisu z db duplicitní názvy sloupců nevadí. Vadí pokud je duplicita názvů sloupců uvnitř poddotazu. Nebo pokud dáte select hodnota a db takový sloupec objeví ve více tabulkách (j a p). Pro orientaci v php použijte ty aliasy, nebo se orientujte podle pořadí sloupce (což není moc univerzální).
|
||
Časová prodleva: 9 let
|
0