[mySQL] Einige Probleme mit Abfragen über mehrere Tabellen

mh1001

Lt. Commander
Registriert
Nov. 2003
Beiträge
2.039
Hallo,

bevor ich mit dem Problem anfange hier erst einmal der Aufbau der Tabellen in der Datenbank:

Code:
CREATE TABLE [color=SeaGreen]rbg_umfragen[/color] (
id INT(11) NOT NULL auto_increment,
titel VARCHAR(255) NOT NULL,
beschreibung TEXT NOT NULL,
aktivitaet TINYINT(1) NOT NULL,
ersteller INT(11) NOT NULL,
status TINYINT(1) NOT NULL,
zeit DATETIME,
PRIMARY KEY  (id)
);

CREATE TABLE [color=SeaGreen]rbg_umfragen_optionen[/color] (
id INT(11) NOT NULL auto_increment,
umfrage INT(11) NOT NULL,
auswahloption TINYINT(1) NOT NULL,
titel VARCHAR(255) NOT NULL,
PRIMARY KEY  (id)
);

CREATE TABLE [color=SeaGreen]rbg_umfragen_stimmen[/color] (
id INT(11) NOT NULL auto_increment,
umfrage INT(11) NOT NULL,
auswahloption INT(11) NOT NULL,
ip VARCHAR(15) NOT NULL,
zeit TIMESTAMP(14),
PRIMARY KEY  (id)
);
Auf das nötigste für die Problemlösung beschränkt liegen also 3 Tabellen mit folgenden entscheidenden Feldern vor:

Code:
[color=SeaGreen]
rbg_umfragen
[color=Blue]id | titel | beschreibung | status

[/color][/color][color=SeaGreen]rbg_umfragen_optionen
[color=Blue]id | umfrage | [/color][/color][color=Blue]auswahloption | titel

[/color][color=Blue][color=Black]Das Feld [color=Blue]umfrage[/color] enthält hier jeweils die entsprechende ID der Umfrage.[/color][/color]
[color=Blue] 
[/color][color=SeaGreen]rbg_umfragen_stimmen
[/color][color=SeaGreen][color=Blue]id | umfrage | [/color][/color][color=Blue]auswahloption

[color=Black]Das Feld [color=Blue]umfrage[/color] enthält hier jeweils die entsprechende ID der Umfrage.
Das Feld [color=Blue]auswahloption[/color] enthält jeweils den Wert des Feldes [color=Blue]auswahlopion[/color] der entsprecheden Option aus der Tabelle [color=SeaGreen]rbg_umfragen_optionen[/color].
[/color][/color]
Nun zur eigentlichen Frage:

Ich möchte mit einer Abfrage alle verschiedenen Optionen einer Umfrage abfragen und gleichzeitig die Anzahl der Stimmen der jeweiligen Auswahloption abfragen.
Ich habe schon einiges mit verschiedenen JOIN-Abfragen versucht, doch ist es mir bis jetzt noch nicht gelungen eine Anständige Lösung zu finden. Wie stelle ich dies am besten an?

Bissher sieht es folgendermaßen aus:

Code:
SELECT COUNT([color=SeaGreen]rbg_umfragen_stimmen[/color].[color=Blue]id[/color]) AS stimmen, [color=SeaGreen]rbg_umfragen_optionen[/color].[color=Blue]titel[/color] FROM [color=SeaGreen]rbg_umfragen_optionen[/color], [color=SeaGreen]rbg_umfragen_stimmen[/color] WHERE [color=SeaGreen]rbg_umfragen_optionen[/color].[color=Blue]id[/color] = [color=SeaGreen]rbg_umfragen_stimmen[/color].[color=Blue]auswahloption[/color] AND [color=SeaGreen]rbg_umfragen_stimmen[/color].[color=Blue]umfrage[/color] = '$umfrage' AND [color=SeaGreen]rbg_umfragen_optionen[/color].[color=Blue]umfrage[/color] = '[color=Black]$umfrage[/color]' GROUP BY [color=SeaGreen]rbg_umfragen_optionen[/color].[color=Blue]id[/color]
Diese Abfrage hat jedoch den Nachteil, dass nur Umfrageoptionen ausgegeben werden, bei denen mindestens eine Stimme - sprich Datensatz in der Tabelle rbg_umfragen_stimmen mit der jeweiligen Auswahloption - vorhanden ist. Alle Versuche diesen Fehler zu beheben liefen jedoch auf einen SQL-Error heinaus. ;)

Besten Dank im schon einmal an alle die sich die Mühe gemacht haben dies durchzulesen. ;)

mh1001
 
Zuletzt bearbeitet:
Hallo,

ich bin mir jetzt nicht ganz sicher, aber könnte das so klappen:

Code:
SELECT COUNT(a.id) as stimmen,b.titel FROM rbg_umfragen_stimmen AS a LEFT JOIN rbg_umfragen_optionen AS b ON b.id = a.auswahloption WHERE a.umfrage = 'blabla' GROUP BY a.id;

Tobias
 
Herzlichen Dank an dich! :daumen:

Jetzt klappt es. Soweit war ich heute auch schon einmal, doch hatte ich wohl den Teil "rbg_umfragen_stimmen.umfrage = '$umfrage'" in der WHERE-Klausel gelassen.
Wenn ich diesen jetzt aber in den LEFT JOIN der Abfrage packe funktioniert es einwandfrei. ;)

MfG mh1001
 
So, da bin ich nun nochmal. ;)
Ich stehe gerade vor einem ähnlichem Problem. Die Lage ist folgende:
Gegeben sind zwei Tabellen, "a" und "b".
Tabelle "a" besitzt eine Spalte namens "status". In Tabelle "b" liegt eine Spalte vor, die jeweils den Identifier zu einem der Datensätze in Tabelle "a" besitzt. Auch ist es möglich, dass mehrere Datensätze mit dem Bezug auf gleichen Identifier existieren

Nun geht es mir darum in einer Abfrage alle Datensätze der Tabelle "a" zu zählen, die in der Spalte "status" den Wert '1' enthalten und mindestens einen dazugehörigen Datensatz, welcher den entsprechendenden Identifier zu diesem Datensatz in Tabelle "b" besitzen.
Wie Stelle ich dies am besten an?

Natürlich könnte ich ebenfalls eine einfache Equi-JOIN-Abfrage starten und die betroffenen Datensätze mit "GROUP BY" und "mysql_affected_rows()" ermitteln, doch dies will ich bewusst umgehen.

Ich hoffe jemand versteht wie das obige gemeint ist, anderfalls kann ich mich auch noch einmal bemühen das ganze irgendwie zu veranschaulichen. ;)


Viele Grüße

mh1001
 
Zuletzt bearbeitet:
Zurück
Oben