Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
MySQL Abfrage über mehrere Tabellen [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-consult PHP Entwicklung
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
MySQL Abfrage über mehrere Tabellen


 
elf7013
08-02-2010, 15:00 
 
Hallo,

wahrscheinlich eine leichte Frage für die Wissenden unter euch:

Hintergrund:
Im Rahmen einer Veranstaltungsevaluation sollen alle Teilnehmer befragt werden.
Beim Aufruf des Fragebogens möchte ich einem Teilnehmer nun alle Veranstaltungen zur Auswahl geben, die er noch beurteilen kann - also zu denen er noch keinen Fragebogen ausgefüllt hat.

Tabellenstruktur:
Veranstaltungen (VID, ...)
Studierende_Veranstaltungen ( SID, VID, teilgenommen [0,1])
Studierende (SID, ...)
Fragebogen (FID, SID, VID, ...)

Mir will gerade die SQL Abfrage nicht einfallen, um all die Veranstaltungen zu ermitteln, die ein Studierender (Beispiel: SID 113) noch beurteilen kann.


Vielen Dank für eure Hilfe!

 
unset
08-02-2010, 15:17 
 
Abgesehen davon, dass dein Post keine Frage zum beantworten enthält: Mit genau dem Topic findest du, wenn du suchst, genau das was du willst. Also: Suchfunktion bemühen!

 
elf7013
08-02-2010, 15:25 
 
Besten Dank für deine Antwort.

Meine Frage lautet wie formuliere ich die entsprechende SQL Abfrage.


Dein Hinweis führt mich selbstverständlich zum Thema Joints und ggf. verschachtelte Abfragen, aber ich komme gerade leider zu keiner Lösung.

 
AmicaNoctis
08-02-2010, 15:46 
 
Hallo,

wie sieht denn deine Abfrage bisher aus und was funktioniert daran nicht so wie es soll?

Gruß,

Amica

 
elf7013
08-02-2010, 16:25 
 
Bisher sah mein Lösungsansatz so aus, dass ich nach die Studierenden_Veranstaltung Tabelle durchsucht habe und eine Lösung in PHP implementiert habe.
Auf dem halben Weg habe ich mich dann daran erinnert, dass die Lösung wahrscheinlich auch mit einer verbesserten Datenbankabfrage funktionieren müsste.

Bisher ist da aber noch nicht viel bei rausgekommen:

SELECT *
FROM Veranstaltungen, Studierende_Veranstaltungen
WHERE SID = 113 AND NOT IN (...)

Tja und beim zweiten Teil habe ich gerade ein Brett vor dem Kopf.

 
AmicaNoctis
08-02-2010, 16:36 
 
Da fehlen trotzdem immer noch Infos.

Ich stelle es mir so vor wie nachfolgend beschrieben, obwohl es eigentlich deine Aufgabe ist, das Problem detailliert darzulegen:
Es sollen also alle Datensätze aus Veranstaltungen ermittelt werden, an denen ein Student auch teilgenommen hat, für die es aber noch keinen Datensatz in Fragebogen gibt.

Trifft das soweit zu?

Was ich auch nicht verstehe: Was ist das Feld teilgenommen? Wenn ein Student an einer Veranstaltung nicht teilgenommen hat, sollte es doch für diese Kombination einfach keinen Datensatz in Studierende_Veranstaltungen geben, oder stellt das Feld irgend etwas anderes dar (erfolgreiche Teilnahme, bestandene Prüfung, ausreichende Anwesenheit)?

Das alles klärst du jetzt bitte lückenlos in deiner nächsten Antwort auf.

 
elf7013
08-02-2010, 16:50 
 
Ich versuche nochmal das Problem zu beschreiben:

Ein Studierende wird zur Bewertung seiner Veranstaltungen eingeladen. Kommt dann durch einen Link zum Fragebogen. Auf dieser Seite sollen in einem Auswahlfeld alle Veranstaltungen erscheinen, die der Studierende noch nicht beurteilt hat (also noch keine Fragebögen existieren).

Also ich möchte all die Veranstaltungsinformationen auslesen, an denen ein Studierende teilgenommen hat. Der Wert "teilgenommen" ist in der Tat nicht von Nöten. Dies leistet ein einfacher Verbund der beiden Tabellen Veranstaltungen und Studierende_Veranstaltung über die anfragende SID des Evaluationslinks.

Welche Information mir nun noch fehlt, ist ob davon bereits Veranstaltungen beurteilt worden sind.



Ich hoffe, dass das Problem nun deutlicher geworden ist. Vielen Dank für die Hilfe!

 
AmicaNoctis
08-02-2010, 16:56 
 
select *
from `Studierende_Veranstaltungen` as s2v
join `Veranstaltungen` as v on v.`VID` = s2v.`VID`
left join `Fragebogen` as f on f.`SID` = s2v.`SID` and f.`VID` = v.`VID`
where f.`FID` is null
and s2v.`SID` = <StudentId>

 
elf7013
10-02-2010, 13:08 
 
Habe dies mal in die phpMyAdmin Oberfläche eingegeben und bekam einen Fehler 1146

select *
from `Studierende_Veranstaltungen` as s2v
join `Veranstaltungen` as v on v.`Veranstaltung_ID` = s2v.`Veranstaltung_ID`
left join `Fragebogen` as f on f.`Studierende_ID` = s2v.`Studierende_ID`
and f.`Veranstaltung_ID` = v.`Veranstaltung_ID`
where f.`Veranstaltung_ID` is null
and s2v.`Studierende_ID` = 2

Die Bezeichner sind hier etwas anders und eine Fragebogen ID habe ich nicht mehr, da ein einzelner Fragebogen ja eindeutig durch SID und VID bestimmt ist, da ein Studierende nur einmal zu einer Veranstaltung einen Fragebogen ausfüllen darf.

 
AmicaNoctis
10-02-2010, 13:11 
 
Der Fehler besagt, dass irgendetwas nicht existiert. Überprüfe die Namen der Tabellen und Spalten und poste bitte immer die vollständige Fehlermeldung, weil man sonst nicht viel dazu sagen kann.

 
elf7013
10-02-2010, 13:38 
 
Die komplette Fehlermeldung aus phpMyAdmin liest sich leider nicht viel besser:

"#1146 - "

Das ist alles. Da steht lediglich noch ein gelbes Warn-i vor.



Edit:
Aber besten Dank! Dein Hinweis hat geholfen den Fehler zu finden. Ich hatte tatsächlich eine Tabelle falsch angegeben.

 
AmicaNoctis
10-02-2010, 13:41 
 
Dann setz das Statement auf der Kommandozeile oder per PHP ab. PHPMyAdmin ist bei dir entweder kaputt oder du hast eine alte Version, denn eigentlich zeigt es die Fehlermeldungen immer an.

 
elf7013
10-02-2010, 13:51 
 
Dann setz das Statement auf der Kommandozeile oder per PHP ab. PHPMyAdmin ist bei dir entweder kaputt oder du hast eine alte Version, denn eigentlich zeigt es die Fehlermeldungen immer an.

Danke für den Hinweis! Werde mich mal an unseren Server Admin wenden :)
Abfrage läuft auf jeden Fall rund :grin:

Vielen Dank für deine Hilfe und deine Geduld mit mir.


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:32 Uhr.