Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zaawansowane zapytanie SQL z odwołaniem do innej tabeli...
Forum PHP.pl > Forum > Bazy danych > MySQL
seba22
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
phpion
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).
seba22
Tu problemem jest to, że tam są dane z innej tabeli, tzn z nie macierzystej :/
phpion
W takim razie zgłebiaj wiedzę również z zakresu złączeń tabel czyli wszelkiego rodzaju JOIN (konkretnie LEFT JOIN).
zegarek84
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
phpion
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>
kefirek
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
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.