Autor Zpráva
Jcas
Profil
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
Super, děkuji.
Jcas
Profil
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
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í).

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: