Jediii
21.07.2012, 13:00:33
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
21.07.2012, 18:56:29
Sprawdz, czy w `wypelnione` jest taka para: id_uzytkownika, id_ankiety
jaslanin
21.07.2012, 18:58:52
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
21.07.2012, 19:35:54
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

Wtedy w widoku złączysz 3 tabele po id user i id ankiety
Jediii
21.07.2012, 20:46:20
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
22.07.2012, 11:34:00
jak byś wybrał widoki i miał problem z nimi daj mi znać wytłumaczę ci co jest 5
Jediii
23.07.2012, 19:08:22
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.