Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak zastąpić w tym przykładzie operator UNION
Forum PHP.pl > Forum > Bazy danych > MySQL
damianooo
Witam , mam taki przykład:

SELECT sum(ile) as suma, name FROM (

SELECT count(p.id) as ile,t.name
FROM Profile p
INNER JOIN Team t
ON p.favorite_team_1_id = t.id
GROUP BY t.name

UNION

SELECT count(p.id) as ile,t.name
FROM Profile p
INNER JOIN Team t
ON p.favorite_team_2_id = t.id
GROUP BY t.name

) a GROUP BY name ORDER BY suma

Potrzebuję zsumować wyniki dwóch zapytań i chciałbym to zrobić bez użycia UNIONa. Można to zrobić inaczej ?

proszę o podpowiedź, dzięki
sowiq
Ja bym zrobił to mniej-więcej tak:

  1. SELECT COUNT(t1.id) AS suma_t1, COUNT(t2.id) AS suma_t2, t1.id AS t1_id, t2.id AS t2_id
  2. FROM Profile p
  3. LEFT JOIN Team t1 ON p.favorite_team_1_id = t1.id
  4. LEFT JOIN Team t2 ON p.favorite_team_2_id = t2.id
  5. GROUP BY t1.id, t2.id
damianooo
nie może być tak , ja to chciałem zsumować kolumnowo ... nie jedne wyniki plus drugie wyniki ... dlatego tam jest UNION i jest to w podzapytaniu aby można było zrobić SUMĘ w polach
sowiq
?
  1. COUNT(t1.id) + COUNT(t2.id) AS suma_wszystkiego


Jeśli nie o to chodziło, to napisz jaki dokładnie chcesz osiągnąć wynik, bo ni cholery nie zrozumiałem Twojego wytłumaczenia.

[edit]
Chyba wiem o co chodziło, chcesz zrobić listę najpopularniejszych rekordów z Team, zgadza się? Jak dla mnie, z taką strukturą bazy danych nie zrobisz tego bez użycia UNION. Jedyne co możesz zrobić to trochę to zoptymalizować, żeby nie robić 3 razy grupowania po stringach i 3 razy wykonywać funkcji liczących.

damianooo
pierwsze zapytanie daje wynik taki:

7 team1
5 team2
2 team3
3 team4

a drugie daje wynik taki:

6 team1
5 team2
6 team3
3 team4

na końcu zapytanie ma wyrzucić SUMĘ a więc to:

13 team1
10 team2
8 team3
6 team4

sorry za złe wytłumaczenie wink.gif
sowiq
Ja bym to chyba zrobił mniej-więcej tak:
  1. SELECT COUNT(1) AS count, t.name
  2. FROM (
  3. SELECT favorite_team_1_id AS ft FROM Profile p WHERE favorite_team_1_id IS NOT NULL
  4. UNION
  5. SELECT favorite_team_2_id AS ft FROM Profile p WHERE favorite_team_2_id IS NOT NULL
  6. ) p
  7. JOIN JOIN Team t ON p.ft = t.id
  8. GROUP BY t.name
  9. ORDER BY count DESC
damianooo
fajnie że próbujesz pomóc ale to nie działa, poza tym pisałem na wstępie że nie chce aby tam był operator UNION ... ale pewnie się nie da ... pewnie spytacie dlaczego nie chcę z UNION więc odpowiem, że dlatego ponieważ w ORM Doctrine za pomocą UNION nie da się zrobić zapytania
mmmmmmm
  1. SELECT count(p.id) AS ile,t.name
  2. FROM team t
  3. LEFT JOIN profile p
  4. ON t.id IN (p.favorite_team_1_id,p.favorite_team_2_id)
  5. GROUP BY 2
damianooo
To co kolega "mmmmmmm" zaproponował też nie działa. Znalazłem jednak z pomocą kolegi rozwiązanie. Można to zrobić tak:

Takie oto zapytanie z UNION:

  1. SELECT sum(ile) AS suma, name
  2. FROM (
  3. SELECT count(p.id) AS ile,t.name
  4. FROM Profile p
  5. INNER JOIN Team t
  6. ON p.favorite_team_1_id = t.id
  7. GROUP BY t.name
  8. UNION
  9. SELECT count(p.id) AS ile,t.name
  10. FROM Profile p
  11. INNER JOIN Team t
  12. ON p.favorite_team_2_id = t.id
  13. GROUP BY t.name
  14. ) a GROUP BY name ORDER BY suma


Można zapienić na takie BEZ UNION:

  1. SELECT t.name, ile1 + ile2
  2. FROM Team t
  3. LEFT JOIN (
  4. SELECT t1.name,t1.id,count(p1.id) AS ile1
  5. FROM Profile p1
  6. INNER JOIN Team t1 ON p1.favorite_team_1_id = t1.id
  7. GROUP BY t1.id,t1.name
  8. ) g1 ON g1.id = t.id
  9. LEFT JOIN (
  10. SELECT t2.name,t2.id,count(p2.id) AS ile2
  11. FROM Profile p2
  12. INNER JOIN Team t2 ON p2.favorite_team_2_id = t2.id
  13. GROUP BY t2.id, t2.name
  14. ) g2 ON g2.id = t.id
  15. WHERE (ile1 + ile2) IS NOT NULL;
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.