Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zaawansowane zapytanie SQL z odwołaniem do innej tabeli...
seba22
post
Post #1





Grupa: Zarejestrowani
Postów: 293
Pomógł: 4
Dołączył: 28.01.2005

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


Witam,

Mam problem, tworząc sobie baze danych postanowiłem takie informacje jak głosy w ankietach trzymać w osobnej tabeli.
( dzięki temu, mogłem na bieżąco wyświetlać ile osób zagłosowało z automatycznym wykluczeniem osoby skasowanej... kasuje osobe, kasuje jej wpis i już na stronie mam wynik -1 )

No i podobało mi się do czasu, kiedy nie postanowiłem zrobić funkcji która pozwalała by na wyświetlanie tylko i wyłącznie ankiet ( pytań ) które zostały odrzucone przez użytkowników. 50 głosów przeciwko, głosów za 3 no to niestety zamykamy, rozwiązane przenosimy do archiwum itp itd.



I teraz problem nastał jak to zrobić aby w 1 zapytaniu typu SELECT wyświetlić wpisy które mają powiedzmy więcej niż 50 głosów przeciw.

Mamy tabele:

Ankiety [id] [reszta danych]
1 tytul
2 tytul drugi

I druga tabela:

Głosy [id] [ID ANKIETY] [TAK/NIE]
1 2 TAK
2 2 TAK
3 2 NIE

id ankiety, to numer identyfikujący wpis z ankietą.


Czy można zrobić jakieś zapytanie żeby wyświetlilo mi wpisy mające tylko powyżej 50 głosów na NIE ?

Potem jak mi odpowiecie państwo na to pytanie, to zajmiemy się ustaleniem co zrobić aby jeżeli jest to możliwe, zbadać stosunek.

Bo 50 głosów na NIE w stosunku do 3 na TAK jest złe
A 50 głosow na NIE w stosunku do 300 na TAK decyduje jednak że ankieta zakonczyla sie pomyślnie.
A 50 na NIE w stosunku do 51 na tak też nie decyduje..

Trzeba by to zrobić jakimś alogrymem podzielić /TAK / przez nie i zobacyzć stosunek, jeżeli będize zbyt mały, to znaczy że trzeba powtórzyć głosowanie...


Był bym bardzo bardzo wdzięczny za pomoc, kiedyś sł←szałem o zapytaniach takich bardziej zaawansowanych, ale nie miałem okazji przetestować..

pozdrawiam

Ten post edytował seba22 11.01.2009, 15:57:41
Go to the top of the page
+Quote Post
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(seba22 @ 11.01.2009, 17:56:24 ) *
Czy można zrobić jakieś zapytanie żeby wyświetlilo mi wpisy mające tylko powyżej 50 głosów na NIE ?

Poczytaj o GROUP BY (do zgrupowania danych) oraz HAVING (do warunku > 50).
Go to the top of the page
+Quote Post
seba22
post
Post #3





Grupa: Zarejestrowani
Postów: 293
Pomógł: 4
Dołączył: 28.01.2005

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


Tu problemem jest to, że tam są dane z innej tabeli, tzn z nie macierzystej :/
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




W takim razie zgłebiaj wiedzę również z zakresu złączeń tabel czyli wszelkiego rodzaju JOIN (konkretnie LEFT JOIN).
Go to the top of the page
+Quote Post
zegarek84
post
Post #5





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Cytat(phpion @ 11.01.2009, 16:55:50 ) *
W takim razie zgłebiaj wiedzę również z zakresu złączeń tabel czyli wszelkiego rodzaju JOIN (konkretnie LEFT JOIN).

po kiego czorta kiedy do:
Cytat(seba22 @ 11.01.2009, 15:56:24 ) *
Czy można zrobić jakieś zapytanie żeby wyświetlilo mi wpisy mające tylko powyżej 50 głosów na NIE ?

wystarczy proste podzapytanie ;p:
  1. SELECT * FROM ankiety WHERE id IN (SELECT id_ankiety FROM glosy GROUP BY id_ankiety HAVING SUM(tak_nie='NIE')>50)


EDIT
oki daję pełna odpowiedź ;p

masz tu wszystkie dane a stosunek TAK/NIE możesz sobie w php policzyć choć da się to w zapytaniu SQL ale po co komplikować ;p:
  1. SELECT glosy.id_ankiety AS Nr_ankiety,ankiety.reszta AS Nazwa_ankiety,sum(glosy.tak_nie='TAK') AS glosy_tak, sum(glosy.tak_nie='NIE') AS glosy_nie FROM glosy LEFT JOIN ankiety ON glosy.id_ankiety=ankiety.id
  2. GROUP BY glosy.id_ankiety HAVING SUM(glosy.tak_nie='NIE')>50


Ten post edytował zegarek84 11.01.2009, 17:40:50
Go to the top of the page
+Quote Post
phpion
post
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(zegarek84 @ 11.01.2009, 19:10:11 ) *
po kiego czorta

Po takiego, że bez podawania gotowego rozwiązania kolega musiałby i tak zapoznać się z podzapytaniami, a wg mnie więcej korzyści osiągnie ze znajomości złączeń. Poza tym co jeśli będzie również chciał wyświetlić liczbę odpowiedzi "Nie" dla danej ankiety?

Cytat(zegarek84 @ 11.01.2009, 19:10:11 ) *
może kliknij pomógł ;p

A, to o to ci chodziło dając gotowe rozwiązanie. Gratuluję!

PS: <ironia>"po kiego czorta" zastosowałeś tu złączenie?</ironia>
Go to the top of the page
+Quote Post
kefirek
post
Post #7





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


Najprosciej tak
  1. SELECT a.*, b.*, COUNT(a.id) AS ile FROM glosy a
  2. LEFT JOIN ankiety b ON a.ankieta_id=b.id
  3. WHERE tak_nie = 'NIE' GROUP BY ankieta_id HAVING ile > 50 ORDER BY ile DESC


Ten post edytował kefirek 11.01.2009, 17:43:34
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: 29.12.2025 - 13:00