Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z dwoma coutami
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
Salon
Mam problem iż mam 2 county w zapytaniu. Problem polega na tym iż gdy polacze tabele (INNER, LEFT, RIGHT - sprawdzałem) cout zlicza mi nie poprawnie i w dodatku w obu sa te same wartosci. Z jednym joinem/coutem zlicza poprawnie.

Zapytanie:

  1. SELECT
  2.  
  3. [USER].name AS [Imię],
  4. [USER].surname AS [Nazwisko],
  5. count ([PISMA].user_id) AS [Ilość pism],
  6. count ([KOPERTY].user_id) AS [Ilość kopert]
  7.  
  8. FROM
  9.  
  10.  
  11. [TABELKA_USEROW] AS [USER]
  12. INNER JOIN [TABELKA_1] AS [PISMA] ON [PISMA].user_id = [USER].user_id
  13. INNER JOIN [TABELKA_2] AS [KOPERTY] ON [KOPERTY].user_id = [USER].user_id
  14.  
  15. WHERE
  16.  
  17. [USER].usergroup_id = 7
  18.  
  19. GROUP BY
  20.  
  21. [USER].name,[USER].surname,[PISMA].user_id,[KOPERTY].user_id
  22.  
  23.  
  24. ORDER BY [Nazwisko]



Ma ktos pomysl bo juz trace sily
Noidea
Nie grupuj po [PISMA].user_id i [KOPERTY].user_id
Salon
to samo :/
mortus
COUNT działa trochę inaczej, niż moglibyśmy oczekiwać, dlatego i z jednym złączeniem dane mogą być nieprawidłowe. Chyba bez podzapytań się nie obejdzie:
  1. SELECT
  2.  
  3. [USER].name AS [Imię],
  4. [USER].surname AS [Nazwisko],
  5. [PISMA].number_per_user AS [Ilość pism],
  6. [KOPERTY].number_per_user AS [Ilość kopert]
  7.  
  8. FROM
  9.  
  10.  
  11. [TABELKA_USEROW] AS [USER]
  12. LEFT JOIN (SELECT user_id, COUNT(user_id) AS number_per_user FROM [TABELKA_1] GROUP BY user_id) AS [PISMA] ON [PISMA].user_id = [USER].user_id
  13. LEFT JOIN (SELECT user_id, COUNT(user_id) AS number_per_user FROM [TABELKA_2] GROUP BY user_id) AS [KOPERTY] ON [KOPERTY].user_id = [USER].user_id
  14.  
  15. WHERE
  16.  
  17. [USER].usergroup_id = 7
  18.  
  19. GROUP BY
  20.  
  21. [USER].name,[USER].surname,[PISMA].user_id,[KOPERTY].user_id
  22.  
  23.  
  24. ORDER BY [Nazwisko]

lub
  1. SELECT
  2.  
  3. [USER].name AS [Imię],
  4. [USER].surname AS [Nazwisko],
  5. (SELECT COUNT(*) FROM [TABELKA_1] AS [PISMA] WHERE [PISMA].user_id = [USER].user_id) AS [Ilość pism],
  6. (SELECT COUNT(*) FROM [TABELKA_2] AS [KOPERTY] WHERE [KOPERTY].user_id = [USER].user_id) AS [Ilość kopert]
  7.  
  8. FROM
  9.  
  10.  
  11. [TABELKA_USEROW] AS [USER]
  12.  
  13. WHERE
  14.  
  15. [USER].usergroup_id = 7
  16.  
  17. GROUP BY
  18.  
  19. [USER].name,[USER].surname,[PISMA].user_id,[KOPERTY].user_id
  20.  
  21.  
  22. ORDER BY [Nazwisko]

Nie wiem, które będzie szybsze, czy oba są optymalne i czy na 100% działają, bo pisałem z głowy.
Salon
dzieki, skorzystałem z drugiej opcji i działa poprawnie.

Wielkie dzieki
prachwal
Cytat(Salon @ 29.07.2011, 13:43:50 ) *
dzieki, skorzystałem z drugiej opcji i działa poprawnie.


ten SQL nie jest poprawny logicznie

nie powinno się robić tego typu numerów (choć można) bo to jest mega wolne

ponadto grupowanie w zapytaniu głównym jest absolutnie zbędne bo co później agregujesz? absolutnie nic

  1. ;with PISMA AS (
  2. SELECT user_id, COUNT(user_id) AS number_per_user FROM [TABELKA_1] GROUP BY user_id
  3. ), KOPERTY AS (
  4. SELECT user_id, COUNT(user_id) AS number_per_user FROM [TABELKA_2] GROUP BY user_id
  5. )
  6.  
  7.  
  8. SELECT
  9.  
  10. [USER].name AS [Imię],
  11. [USER].surname AS [Nazwisko],
  12. [PISMA].number_per_user AS [Ilość pism],
  13. [KOPERTY].number_per_user AS [Ilość kopert]
  14.  
  15. FROM
  16.  
  17.  
  18. [TABELKA_USEROW] AS [USER]
  19. LEFT JOIN [PISMA] ON [PISMA].user_id = [USER].user_id
  20. LEFT JOIN [KOPERTY] ON [KOPERTY].user_id = [USER].user_id
  21.  
  22. WHERE
  23.  
  24. [USER].usergroup_id = 7
  25.  
  26.  
  27. ORDER BY [Nazwisko]
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-2024 Invision Power Services, Inc.