[SQL] Umfrage

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
The_Real_Black
Establishment
Beiträge: 110
Registriert: 19.01.2008, 19:57
Benutzertext: Happy Coding
Kontaktdaten:

[SQL] Umfrage

Beitrag von The_Real_Black »

Hallo ich wollte eine Umfrage auf einer Webseite einbauen, leider komme ich mit meiner SQL Abfrage nicht weiter.

Aufbau der Tabellen:

TabelleA_Umfragen : ID, Frage, (...)
TabelleB_Votings: ID, ID_Frage, UserName

ID_Frage ist der Fremdschlüsel der Umfrage. Der Username ist nur ein String, da ich noch keine User in der DB habe. Nach der Abstimmung soll jeder User nur die von ihm noch unbeantworteten Umfragen sehen: Ich suche also alle Umfragen bei dem der user noch nicht abgestimmt hat, aber wie muss da nun der Select aussehen?

Mit
select Umfrage.* from Umfrage left join Votings on Umfrage.ID = Votings.ID_Frage where not Votings.UserName = "AUserName"
kommt nichts sinvolles raus.
:?:
Happy Coding.
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: [SQL] Umfrage

Beitrag von Top-OR »

Vorwarnung: Ich bin gerade aufgestanden und habe nur mal überflogen. Wenn ich jetzt totalen Brei rede, sorry: Ich bin noch nicht wach.

Mit

SELECT *
FROM Umfrage
JOIN Votings ON Umfrage.ID = Votings.ID_Frage
WHERE Votings.UserName LIKE "AUserName"

solltest du ja rausbekommen, welche Umfragen ein Nutzer schon gemacht hat. Geht DAS soweit, oder kommt da auch Mist raus?

Bringt das Umkehren des Kriteriums mit NOT wirklich die Umfragen, die der Nutzer noch NICHT gemacht hat?
Ich denke NICHT, da der User ja noch keine Einträge in Votings (ist ja nur ne "M-zu-N-Zuordnungstabelle", oder?) hat, sondern die anderen User-Umfragen ...

Oder seh ich das falsch?

Versuch mal mit Subquery:
SELECT * FROM umfrage WHERE umfrage.id NOT IN (SELECT Votings.Frage_ID FROM Umfrage JOIN Votings ON Umfrage.ID = Votings.ID_Frage WHERE Votings.UserName LIKE "AUserName")

Ist jetzt bestimmt NICHT die eleganteste Lösung, aber es sollte gehen...


Anmerkung: SELECT STERN hat der TEUFEL GEMACHT! Rumpelstielzchen *PUFFFFF*
--
Verallgemeinerungen sind IMMER falsch.
Benutzeravatar
The_Real_Black
Establishment
Beiträge: 110
Registriert: 19.01.2008, 19:57
Benutzertext: Happy Coding
Kontaktdaten:

Re: [SQL] Umfrage

Beitrag von The_Real_Black »

Danke, es klappt!
Happy Coding.
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: [SQL] Umfrage

Beitrag von Top-OR »

Freut mich.

Was mir gerade auffällt: Das JOINEN in dem Inner-Query kannste dir so eigendlich auch sparen. So sollte es reichen:

SELECT * FROM umfrage WHERE umfrage.id NOT IN (SELECT Votings.Frage_ID FROM Votings WHERE Votings.UserName LIKE "AUserName")

Das sollte nochman nen Ticker schneller werden, weil das DBMS dann nicht erst den Join machen muss. Der ist in diesem Zusamenhang völlig für den Garten.


Es gibt möglicherweise auch ne Lösung mit JOINS bzw. ohne die NESTED QUERY, aber da steh ich momentan auch ein wenig auf dem Schlauch ...
--
Verallgemeinerungen sind IMMER falsch.
Jaw
Beiträge: 54
Registriert: 14.07.2004, 01:00
Wohnort: Raum Düsseldorf

Re: [SQL] Umfrage

Beitrag von Jaw »

Ich hätt was in Richting OUTER JOIN und dann WHERE username is null versucht aber kriegs im Kopf nicht auf die Reihe. Aber hat sich ja eh schon gelöst. Wäre jetzt nur noch Gedankenspiel.
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: [SQL] Umfrage

Beitrag von Top-OR »

Jaw hat geschrieben:Ich hätt was in Richting OUTER JOIN und dann WHERE username is null versucht aber kriegs im Kopf nicht auf die Reihe. Aber hat sich ja eh schon gelöst. Wäre jetzt nur noch Gedankenspiel.
Ja, ich würde auch denken, dass sowas geht. Muss gehen, denn die Nested Queries unterstützt zumindest MySQL noch nicht "so lange".
Aber mir gehts ähnlich: Ich bekomm es im Kopf nicht hin (und bin zu faul, es auszuprobieren).
--
Verallgemeinerungen sind IMMER falsch.
Antworten