Autor | Zpráva | ||
---|---|---|---|
Chodec Profil |
#1 · Zasláno: 24. 2. 2011, 11:29:33 · Upravil/a: Chodec
Mám 3 tabulky:
- V `akce_info`mám popis jednotlivých akcí (1 akce = 1 řádek) - V `akce_fotky`mám fotky k jednotlivým akcím (1 akce = 0 až x fotek = 0 až x řádek) - V `akce_videa`mám videa jednotlivým akcím (1 akce = 0 až x videí = 0 až x řádek) Potřebuji jedním dotazem zjistit kolik fotek a vidí je ke každé akci. Když ale použiji následující dotaz, dle výsledku soudím, že mě to vždy jen počet fotek a videí mezi sebou vynásobí. SELECT COUNT(`Fotka`) AS `FotkyPocet`, COUNT(`Video`) AS `VideaPocet` FROM `akce_info` LEFT JOIN `akce_fotky` USING (`Adresar`) LEFT JOIN `akce_videa` USING (`Adresar`) WHERE `Adresar` = '".$id."' GROUP BY `Adresar` Jak to mám upravit, aby to fungovali správně? |
||
Taps Profil |
#2 · Zasláno: 24. 2. 2011, 11:43:30
Chodec:
možná by nebylo na škodu, napsat se strukturu jednotlivých tabulek. |
||
Chodec Profil |
#3 · Zasláno: 24. 2. 2011, 11:46:03
akce_info
- Adresar - Popis akce_fotky - Adresar - cesta k fotkce akce_videa - Adresar - cesta k videu |
||
Taps Profil |
#4 · Zasláno: 24. 2. 2011, 11:59:08
Chodec:
můžeš zkusit níže uvedené SELECT *, COUNT(`Fotka`) AS `FotkyPocet`, COUNT(`Video`) AS `VideaPocet` FROM `akce_info` LEFT JOIN `akce_fotky` USING (`Adresar`) LEFT JOIN `akce_videa` USING (`Adresar`) WHERE `Adresar` ='$id' GROUP BY `Adresar` |
||
Chodec Profil |
#5 · Zasláno: 24. 2. 2011, 12:01:41
To je to samé, jen se vyberou i sloupce z první tabulky.
|
||
Taps Profil |
#6 · Zasláno: 24. 2. 2011, 12:06:02 · Upravil/a: Taps
Chodec:
zkusil jsem to ještě přepsat do jiné podoby SELECT COUNT(`Fotka`) AS `FotkyPocet`, COUNT(`Video`) AS `VideaPocet` FROM `akce_info` ai LEFT JOIN `akce_fotky` ak on ai.Adresar=ak.Adresar LEFT JOIN `akce_videa` av on ai.Adresar=av.Adresar WHERE ai.Adresar = '$id' GROUP BY ai.Adresar |
||
Chodec Profil |
#7 · Zasláno: 24. 2. 2011, 12:08:42
Žádná změna, stále se to násobí. Zkusím to přepsat do"Řádkového pohledu".
|
||
Chodec Profil |
#8 · Zasláno: 24. 2. 2011, 12:14:07 · Upravil/a: Chodec
Tak konečně to funguje!
SELECT `Adresar`, `FotkyPocet`, `VideaPocet` FROM `akce_info` LEFT JOIN ( SELECT `Adresar`, COUNT(`Fotka`) AS `FotkyPocet` FROM `akce_fotky` WHERE `Adresar` = '".$id."' ) AS `akce_fotky_temp` USING (`Adresar`) LEFT JOIN ( SELECT `Adresar`, COUNT(`Video`) AS `VideaPocet` FROM `akce_videa` WHERE `Adresar` = '".$id."' ) AS `akce_videa_temp` USING (`Adresar`) WHERE `Adresar` = '".$id."' |
||
Taps Profil |
#9 · Zasláno: 24. 2. 2011, 12:15:03
jakou hodnotu máš nastavenou u položky Adresar v tabulce akce_info a jaký je nastaven typ u této položky ?
|
||
pcmanik Profil |
#10 · Zasláno: 24. 2. 2011, 12:38:05
Chodec:
To nieje spravny pristup, ty tie joiny ani nevyuzijes, na to ti bohate stacia len tie selecty, nie som na toto expert, Kajman ti snad poradi :) |
||
TomášK Profil |
#11 · Zasláno: 24. 2. 2011, 12:47:00
pcmanik:
Je to správný přístup. |
||
Kajman_ Profil * |
#12 · Zasláno: 24. 2. 2011, 13:02:51
šlo by to i
SELECT `Adresar`, (SELECT COUNT(*) FROM `akce_fotky` f WHERE f.`Adresar` = i.`Adresar`) `FotkyPocet`, (SELECT COUNT(*) FROM `akce_videa` v WHERE v.`Adresar` = i.`Adresar`) `VideaPocet` FROM `akce_info` i WHERE `Adresar` = '".$id."' S těmi joiny by se to spíše hodilo, když by se nevybíral pouze jeden adresář, ale to by tam pak místo where muselo být group by adresar. |
||
Chodec Profil |
#13 · Zasláno: 24. 2. 2011, 13:32:33 · Upravil/a: Chodec
Díky. Taky možnost. Ale v případě, že bych třeba ještě sčítal velikost fotek a videí, tak už by tam těch selectů bylo moc. A to už asi není správné, co?
SELECT `Adresar`, (SELECT COUNT(*) FROM `akce_fotky` f WHERE f.`Adresar` = i.`Adresar`) `FotkyPocet`, (SELECT SUM(`Velikost`) FROM `akce_videa` v WHERE v.`Adresar` = i.`Adresar`) `VideaVelikost` (SELECT COUNT(*) FROM `akce_videa` v WHERE v.`Adresar` = i.`Adresar`) `VideaPocet` (SELECT SUM(`Velikost`) FROM `akce_videa` v WHERE v.`Adresar` = i.`Adresar`) `VideaVelikost` FROM `akce_info` i WHERE `Adresar` = '".$id."' |
||
Kajman_ Profil * |
#14 · Zasláno: 24. 2. 2011, 15:01:01
To už by mohla být lepší ta varianta s joinem z [#8]
Ale myslím, že když si otestujete rychlosti obou způsobů, tak tam velké rozdíly nebudou. |
||
Časová prodleva: 13 let
|
0