Autor Zpráva
chromko
Profil
Ako by som mohol prepísať (optimalizovať) toto query, aby bolo bez toľkých 'select'. Potrebujem zistiť koľko má daný uživateľ napr. videi, recenzi, atď .

Doteraz som to riešil subselectami, ale ako by sa to dalo prepisať elegantnejšie? Respektíve, niečo čo môže byť potencialne rýchlejšie, kedže veľa selectov asi nie je dobré riešenie..

query:
SELECT profily.*, user.name, user.priezvisko, user.nickname, user.datum, 
  (SELECT COUNT(*) FROM video WHERE video.pridal='$cl_det_je' AND video.zobrazovat='1') AS poocetvideoo, 
  (SELECT COUNT(*) FROM prispevky WHERE prispevky.pridal='$cl_det_je' AND prispevky.zobrazovat='1') AS kolkopris, 
  .... // atď. ďalších 10 selectov
FROM profily  
LEFT JOIN user 
ON profily.p_n=user.id
WHERE profily.p_n='$cl_det_je' LIMIT 1
o_O
Profil
Šlo by to přepsat všechno na left-joiny stylem:
SELECT u.*, count(distinct p.pid) AS pocet_prispevku, count(distinct v.vid) AS pocet_video FROM users u LEFT JOIN prispevky p ON (u.uid=p.puid) LEFT JOIN video v ON (u.uid=v.pridal) WHERE u.uid=$cl_det_je


Důležité je tam to distinct. V případě výběru více uživatelů nezapomeňte přidat GROUP BY.
Kajman_
Profil *
Tipuji, že optimálnější bude pro databázi první řešení. Není vždy pravda, že méně výskytů slova select zvýší rychlost.
o_O
Profil
Kajman:
A to mnohonásobně.

Zobrazeny záznamy 0 - 0 (1 celkem, dotaz trval 9.1272 sekund)
SELECT u . * , count( DISTINCT p.pid ) AS pocet_prispevku, count( DISTINCT v.vid ) AS pocet_video
FROM users u
LEFT JOIN prispevky p ON ( u.uid = p.puid )
LEFT JOIN video v ON ( u.uid = v.pridal )
WHERE u.uid =1


Zobrazeny záznamy 0 - 0 (1 celkem, dotaz trval 0.0072 sekund)
SELECT * , (

SELECT count( pid )
FROM prispevky
WHERE puid =1
) AS pocet_prispevku, (

SELECT count( vid )
FROM video
WHERE pridal =1
) AS pocet_video
FROM users
WHERE uid =1


V obou případech jsem vybíral 2600 příspěvků a 1557 videí.

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