Autor Zpráva
Chodec
Profil
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
Chodec:
možná by nebylo na škodu, napsat se strukturu jednotlivých tabulek.
Chodec
Profil
akce_info
- Adresar
- Popis

akce_fotky
- Adresar
- cesta k fotkce

akce_videa
- Adresar
- cesta k videu
Taps
Profil
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
To je to samé, jen se vyberou i sloupce z první tabulky.
Taps
Profil
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
Žádná změna, stále se to násobí. Zkusím to přepsat do"Řádkového pohledu".
Chodec
Profil
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
jakou hodnotu máš nastavenou u položky Adresar v tabulce akce_info a jaký je nastaven typ u této položky ?
pcmanik
Profil
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
pcmanik:
Je to správný přístup.
Kajman_
Profil *
š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
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 *
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.

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