MySQL Abfrage - brauche Idee

D

Degger

Mitglied
Thread Starter
Dabei seit
30.07.2008
Beiträge
65
Reaktionspunkte
1
Hallo Macuser!
Habe mal wieder eine interessante Frage zwecks einer MySQL-Abfrage.
Ich baue gerade an einem Fussball-Tippspiel bzw. habe es schon recht weit vorangetrieben und einsatzbereit.
Zum Problem:
Ich habe drei Tabellen, die User, Spiele und die dazugehörigen Tipps beinhalten. In der Tipptabelle werden per Referenz nur die ID des Spiels und zum anderen die ID des Users gespeichert, sowie das getippte Ergebnis.
Soweit sogut...
Ich möchte nun gern für den Admin ne Info zur Verfügung stellen, welche User noch nicht für welches Spiel getippt haben.
Besonders dabei ist, das ja die Infos die ich In der Abfrage ermitteln möchte, eigentlich nicht In der Tipptabelle vorhanden sind, sondern eben nur die Infos, welche User bereits für welches Spiel getippt haben. Will also eigentlich genau das Gegenteil sozusagen von dem, was in der Tipps-Tabelle steht.
Diese Infos sollen erstmal reichen, ich hoffe es hat schon jemand eine Idee, denn ich hab schon jede Menge probiert, aber nix richtiges gefunden.
Ich hoffe das ist soweit erstmal verständlich und jemand kann mir weiterhelfen ;)

Zur Vereinfachung der etwaige Aufbau der Tabellen:
User: id, name (...)
Spiele: id, spielbezeichnung (...)
Tipps: spiel_id, user_id (...) [spiel_id und user_id sind hier das Primärschlüsselpaar]
 
Code:
SELECT spiele.id AS spiel, users.id AS user
	FROM spiele, users
	WHERE NOT EXISTS (
		SELECT * FROM tipps WHERE spiel_id=spiel AND user_id=user
	);
 
Etwas in diese Richtung? Mit Nested Query:

Code:
SELECT user.id FROM tipps INNER JOIN user ON tipps.user_id = user.id WHERE tipps.user_id IS NOT (SELECT user_id FROM tipps WHERE spiel_id = "$BetreffendeSpielID")
 
es gibt da sogar ein extra DB-Forum hier im Board ;)
 
Code:
SELECT spiele.id AS spiel, users.id AS user
	FROM spiele, users
	WHERE NOT EXISTS (
		SELECT * FROM tipps WHERE spiel_id=spiel AND user_id=user
	);

Cool, das klappt wirklich. Sieht auch noch voll einfach aus :)
Ich danke!
 
Schreibst du die Queries noch per Hand? Schon mal etwas von ORM gehört?
 
Ja schreibe sie per Hand...will dadurch aber auch MySQL lernen, da ich noch nicht sooo viel Erfahrung damit habe. Von ORM hab ich schon mal entfernt was gehört, aber eher in Bezug auf Visual Basic bzw. die .net Sprachen...
 
@tafkas: Ich finde es durchaus richtig, erst einmal zu verstehen, wie SQL oder andere Datenbanken funktionieren, bevor man Hilfsmittel verwendet, die einem redundante Arbeiten abnehmen.
 
Schreibst du die Queries noch per Hand? Schon mal etwas von ORM gehört?

:D ich habe hier so eine DB von einem Drittanbieter durchnormalisiert bis zum Anschlag und von .net OR-Mappern zusammengefrickelte Abfragen. Wenn ich mir die in den Trace-Dateien anschaue, dann weiß ich warum die Software so lahm ist. Da sind teilweise 30 Joins ( kein Witz!) auf 10-15 Tabellen drinnen. Einige davon 3fach redundant. OR-Mapper sind schön, ich nutze die auch, aber ich achte darauf das die SQL-Abfragen von *mir* sind und nicht vom Mapper!

Die meisten Applikationen sind wegen schlechter SQL-Abfragen lahm und Schuld ist nat der DB-Server.

Ich habe auch schon einen Geschäftsführer mit stolz geschwellter Brust gesehen der mir gezeigt hat das eine Abfrage der Kundenhistorie über 40 Sekunden dauerte. Der fand das gut, zeigt das doch wie groß sein Datenbestand und damit sein Kundenkreis sind. So verquer muß man erstmal denken :hehehe: (dabei fehlten in dem Fall schlicht Indizes auf die Tabelle!).
 
Schreibst du die Queries noch per Hand? Schon mal etwas von ORM gehört?
Klar, warum nicht? Wenn die DB nicht bis zu gehtnichtmehr normalisiert ist, ist das auch meine bevorzugte Methode. Sofern maximal 4-5 Tabellen in der Abfrage vorkommen, bin ich damit schneller und flexibler als mit irgendeinem Modeler. Besonders wenn ich zwischendurch immer mal Parameter verändere und erst recht, wenn die Abfrage später in eine Funktion oder eine dynamische Seite rein soll.
 
Zumal das ja auch noch Spass macht, SQL-Abfragen zu erstellen...zumindest mir :)
 
Zurück
Oben Unten