Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak zadbać o wydajność..., Zliczanie countem z dwoch zewnetrznych tabel (1..*)
beherit
post
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 29.07.2009

Ostrzeżenie: (0%)
-----


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ę:
(IMG:http://brylant.ists.pwr.wroc.pl/~pablo/bd/class_diag0.jpg)
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?


Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
Mchl
post
Post #2





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
beherit
post
Post #3





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 29.07.2009

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif) Dzieki za pomoc.

Ten post edytował beherit 22.06.2010, 11:41:14
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 19:39