Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Porównywanie wyników z bazy danych.
Forum PHP.pl > Forum > Przedszkole
Jediii
Witam.

W ramach ćwiczeń piszę taką prostą aplikację ankietową. Wszystko z nią związane (ankiety, osoby wypełniające, pytania, odpowiedzi itp.) zapisuje do bazy danych. Natrafiłem jednak na pewien problem, z którym mam nadzieję dzięki Wam sobie poradzę.

Główne założenia w skrócie:
1. Tworze użytkownika.
2. Tworze grupę.
2. Dodaje użytkownika do grupy np. do grupy "test".
3. Tworze ankietę.
4. Dodaję ankietę do grupy "test", aby była dla niej widoczna.
5. Użytkownik widzi ankietę, bo są w tej samej grupie, ale pod warunkiem, że jej wcześniej nie wypełnił.

Posiadam tabele:
Użytkownicy {id_użytkownika, ...}.
Grupy (id_grupy, ...}.
Grupy_użytkowników {id_użytkownika, id_grupy} - występuję tutaj INNER JOIN z Użytkownikami i Grupami.
Ankiety {id_ankiety, ...}.
Widoczność_ankiety {id_ankiety, id_grupy} - występuję INNER JOIN z Ankietami i Grupami.
Pytania {id_pytania, id_ankiety, ...} - występuję tutaj INNER JOIN z Ankietami.
Odpowiedzi (id_answer, id_pytania} - występuję tutaj INNER JOIN z Pytaniami.
Wypełnione (id_użytkownika, id_ankiety}.

Doszedłem do momentu, gdzie trzeba sprawdzić, jakie użytkownik ma dostępne ankiety do wypełniania oraz czy ich już przypadkiem nie wypełnił i tutaj właśnie zaczynają się problemy. Chociaż mogę pobrać wszystkie ankiety widoczne dla poszczególnego użytkownika poprzez INNER JOIN, to jednak nie wiem, jak sprawdzić, czy wcześniej danej ankiety on nie wypełnił.

Pierwsze co pomyślałem, to pobiorę dostępne ankiety dla użytkownika, następnie wezmę wszystkie ankiety z tabeli Wypełnione, które wypełnił i je porównam, jednak po chwili zastanowienia, to nie był dobry pomysł.

Jeżeli brakuję jakiś informacji lub coś tutaj pokręciłem, to proszę dać znać.

Nie liczę wcale na gotowce, ale mam nadzieje, że mnie nakierujecie. Będę bardzo wdzięczny.
mmmmmmm
Sprawdz, czy w `wypelnione` jest taka para: id_uzytkownika, id_ankiety
jaslanin
dodaj podzapytanie w formułce SELECT które będzie liczyło ile ankiet uzupełnił czyli coś w stylu (SELECT COUNT(*) FROM wypelnione w WHERE w.id_użytkownika = && w.id_ankiety =) ile_wypelnil

potem w WHERE głównego zapytania daj WHERE ile_wypelnil = 0

możesz też użyć JOIN'a w stylu

JOIN ON (Użytkownicy.id_użytkownika = wypelnione .id_użytkownika && Ankiety.id_ankiety != Wypełnione .id_ankiety )
Mgorka
Hej a ja bym ci radził poczytać o widokach w db (view) i zrobić połączenie 5 tabel Użytkownicy Ankiety Widoczność Grupy_użytkowników Wypełnione a żeby pomniejszyć zapytanie nie lepiej będzie ci w tabeli Widoczność_ankiety zamiast id grupy dać id_user i dodać kolumnę wypełnienie i wartość logiczna a w ankiecie dodać kolumnę id_gurpy żeby było przypisanie questionmark.gif Wtedy w widoku złączysz 3 tabele po id user i id ankiety
Jediii
Dziękuję za Wasze odpowiedzi. Jutro na spokojnie sobie to wszystko przeanalizuję i zobaczę, co mi z tego wyjdzie. Dzisiaj już nie mam na to siły.
Mgorka
jak byś wybrał widoki i miał problem z nimi daj mi znać wytłumaczę ci co jest 5
Jediii
Cytat(Mgorka @ 22.07.2012, 12:34:00 ) *
jak byś wybrał widoki i miał problem z nimi daj mi znać wytłumaczę ci co jest 5


Widoki to rzeczywiście dobry pomysł. Znacznie uproszczą zapytania. Jednak zanim je opanuje, to może trochę czasu zająć, szczególnie w przypadku moich zapytań, gdzie jest kilka INNER JOIN. Piszę to nie znając dobrze tych widoków, więc może (i oby) to tylko tak strasznie wyglądało, hehe.

@jaslanin
Jeszcze nie miałem chwili czasu na przeanalizowanie tego, co napisałeś. Jednak na pewno to na spokojnie zrobię.

Dziękuję Wam.
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.