Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> jak zastąpić w tym przykładzie operator UNION
damianooo
post
Post #1





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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
Go to the top of the page
+Quote Post
sowiq
post
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


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





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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
Go to the top of the page
+Quote Post
sowiq
post
Post #4





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


?
  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.



Ten post edytował sowiq 10.05.2013, 14:11:55
Go to the top of the page
+Quote Post
damianooo
post
Post #5





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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 (IMG:style_emoticons/default/wink.gif)

Ten post edytował damianooo 10.05.2013, 14:22:47
Go to the top of the page
+Quote Post
sowiq
post
Post #6





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


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


Ten post edytował sowiq 10.05.2013, 14:33:57
Go to the top of the page
+Quote Post
damianooo
post
Post #7





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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

Ten post edytował damianooo 10.05.2013, 15:14:45
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #8





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


  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
Go to the top of the page
+Quote Post
damianooo
post
Post #9





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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;


Ten post edytował damianooo 11.05.2013, 12:26:03
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: 3.10.2025 - 04:34