Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak zadbać o wydajność...
Forum PHP.pl > Forum > Bazy danych > MySQL
beherit
Mam sobie takie zapytanie

  1. SELECT
  2. userData.userId, COUNT(user2site.siteId)
  3. FROM
  4. userData LEFT JOIN user2site USING(userId)
  5. WHERE
  6. userData.userOwnerId IN (1000,1002) OR
  7. userData.userOwnerId IS NULL
  8. GROUP BY
  9. userData.userId

i mniej więcej taka strukturę:

gdzie z lewej jest 1 a z prawej * (1..*)

Jak rozbudować to zapytanie, żeby w wyniku otrzymać prawidłowe
COUNT(siteWords.wordId) i jednocześnie dbając o wydajność.

Jakieś podpowiedzi?


Mchl
Tak może (ale nie musi - sprawdź) być trochę lepiej:

Kod
SELECT
  userData.userId, sq.cnt
FROM
  userData
LEFT JOIN (
  SELECT
    userId,
    COUNT(*) AS cnt
  FROM
    user2site
  GROUP BY
    userId
) AS sq
USNIG(userId)
WHERE ...


Poza tym sprawdź EXPLAINem obie wersje, czy korzystają z indeksów.
beherit
Zmodyfikowałem to tak:
  1. SELECT
  2. userData.userId, COUNT(userSitesData.siteId) AS userSites, userSitesData.userWordsCount AS userWords
  3. FROM
  4. userData
  5. LEFT JOIN (
  6. SELECT
  7. userId,
  8. siteId,
  9. COUNT(siteWords.wordId) AS userWordsCount
  10. FROM
  11. user2site
  12. LEFT JOIN
  13. siteWords
  14. USING(siteId)
  15. GROUP BY siteId
  16. ) AS userSitesData
  17. USING(userId)
  18. WHERE
  19. userData.userOwnerId IN (1000,1002) OR
  20. userData.userOwnerId IS NULL
  21. GROUP BY
  22. userId,siteId

i mam w wyniku:
"userId";"userSites";"userWords"
"1000";"0";NULL
"1001";"1";"2"
"1001";"1";"6"

które mnie nie urządza, gdyż wynik oczekiwany jest:
"userId";"userSites";"userWords"
"1000";"0";NULL
"1001";"2";"8"

zmiana prosta do zrozumienia, ale jakoś cięższa do napisania.

PS. Na klucze i sprawdzanie ich użycia przyjdzie pora niebawem ... klucze wolę definiowac graficznie a nie z palca, phpmyadmin nie chce wspolpracowac, a softu heidisql nie mam pod reka.

Ok jest.
  1. SELECT
  2. userData.userId, COUNT(userSitesData.siteId) AS userSites, SUM(userSitesData.userWordsCount) AS userWords
  3. FROM
  4. userData
  5. LEFT JOIN (
  6. SELECT
  7. userId,
  8. siteId,
  9. COUNT(siteWords.wordId) AS userWordsCount
  10. FROM
  11. user2site
  12. LEFT JOIN
  13. siteWords
  14. USING(siteId)
  15. GROUP BY siteId
  16. ) AS userSitesData
  17. USING(userId)
  18. WHERE
  19. userData.userOwnerId IN (1000,1002) OR
  20. userData.userOwnerId IS NULL
  21. GROUP BY
  22. userId
  23.  

Zabieram się za klucze smile.gif Dzieki za pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.