Problem mit Anwendung von 2 SQL anweisungen

invaider

Mitglied
Hi,

hab folgendes Problem. Ich hab ne Galerie sleber Programmiert. Funktioniert soweit auch einwandfrei.
Man kann auch Kommentare hinzufügen. Nun will ich aber auch noch unter das entsprechende Bild die Anzahl der Kommentar haben.
Wie mach ich nun aber die Abfrage auf den Momentant aktuellen Datensatz.
Weil der läuft ja in ner Schleife durch.

<SQL-Anweisung>
<Schleifenbeginn>
ausgabe vom Bild
<Schleifenende>


und aussehen soll des dann ja so


<SQL-Anweisung>
<Schleifenbeginn>
ausgabe vom Bild
<SQL-Anweisung wegen Kommentaranzahl>
<Schleifenende>

kann ich da irgendwie sagen:

WHERE Kommentar = this ?

mfg Invaider
 

Luzie

Erfahrenes Mitglied
Hi

Du hast eine Tabelle, wo die Bilder gespeichert werden und eine Tabelle für die Kommentare? Oder nutzt Du ingesamt eine Tabelle (vermutlich nicht, die müsstest Du dann rekursiv auslesen)

Ich gehe jetzt mal davon aus, dass Du 2 Tabellen hast. In dem Falle:

Du musst beide Tabelle über ein Beziehungsfeld miteinander verbinden. Am besten über den Left Join, denn es gibt bestimmt auch Bilder ohne Kommentare.

In meinem Beispiel handelt es sich um das Feld bildid in der Tabelle Kommentar.
Über den count(feld) wird dann die Anzahl der jeweiligen Kommentare über den alias Anzahl angzeigt.

Code:
SELECT bild.id, bild.bildtext, count(kommentar.bildid) as anzahl
FROM bild left JOIN kommentar ON bild.id = kommentar.bildid
group by bild.id, bildtext

Einfach anpassen und nur noch in der Schleife ausgeben.
 

invaider

Mitglied
Jup ich hab 2 Tabellen.
soweit auch alles verstanden. Nur wie geb ich dann die Anzahl aus?
Ist durch das "as" die anzahl zu einer Art Feld geworden des ich direkt ansprechen kann

Danke schon mal im vorraus.

mfg Invaider
 

Luzie

Erfahrenes Mitglied
Hi

ja, as leitet einen Alias ein. Wenn dies nicht passiert, setzt access z.B. einen eigenen Namen darein expr1 oä. Also Anzahl genauso behandeln wir die anderen Feldbezeichnungen.
 

invaider

Mitglied
danke.
aber nun mag der mich erst recht nimmer.
also die Anweisung is nun noch komplizierter geworden weil ich halt 3 Tabellen hab
1. die Gallerien (Bilderpfad und Galerienname)
2. die Bilder (Bildername)
3. die Kommentare (die kommentare halt)

und nun versuch ich verzweifelt die alle miteinander zu verknüpfen

hier mal meine Momentane Anweisung.
Code:
      Rs.Open "SELECT Galerie.Pfad, Galerie.Titel, Bilder.ID, Bilder.Bildername, count(Kommentar.fkbilder) as Anzahl 
      FROM (Galerie LEFT JOIN Bilder ON Galerie.ID = Bilder.fkgalerie) LEFT JOIN Kommentar ON Bilder.ID = Kommentar.fkbilder
     WHERE Bilder.fkgalerie ="& GalerieID, Conn, 1,3

und es kommt nun immer Folgende Meldung
Code:
   Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'Pfad' nicht als Teil der Aggregatfunktion einschließt.
das Feld Pfad ist aber in der Tabelle Galerie.
also muss doch was in der Anweisung falsch sein.
Funktioiniert der LEFT JOIN nur einmal?
weil habs auch mit nem INNER JOIN gemacht und des tut au net *am verzweifeln bin*

grüßle Jochen
 

Luzie

Erfahrenes Mitglied
Hi

über 3 Tabellen ist es immer etwas schwieriger.

Ich würde mir für die Gallerie und die Bilder, also die Tabellen, die zusammengehören, eine Abfrage oder ein View erstellen. (Datenbank Access Abfrage).

Dann würde ich die Abfrage mit der Tabelle kommentare über den Left join in Verbindung bringen. Tabelle kommentare muss rechts stehen, deshalb der left join.

Den Left join wirst Du auch aus dem Grunde nehmen müssen, weil es ja möglich sein kann, dass einige Bilder noch keine Kommentare haben. Diese würde dann beim inner join nicht dargestellt. Mit dem Left Join bekommen sie den Wert 0.

Schau Dir nochmal mein Beispiel an.
Die Fehlermeldung kommt daher, wenn man eine Aggregatfunktion verwenden count() sum() AVG() etc. dann muss man die restlichen Felder nach der where-Bedingung gruppiernen (sh. Group by!)
 

invaider

Mitglied
so SQL funktionert nun *freu*
aber nur noch ne kleinigkeit *mich schäm*:-(
und zwar gibt der mir immer die ID von dem Bild aus.
ich geb die Werte immer so aus
Code:
response.Write rs("Anzahl").value
stimmt des in dem Fall so :confused:

Grüßle Jochen
 

Luzie

Erfahrenes Mitglied
Hi

hmmm....

das ganze Objekt wird geschrieben

rs.fields.item("anzahl").value

die Schreibfaulen, wie ich, nehmen zur einfachen Ausgaben rs("anzahl"), oder rs(0), rs(1), also den index. Die zählen in den Feldern nach Ausgaben hoch.

Select id, bild, x from tabelle

da wäre rs(0) die id
rs(1) das bild
rs(2) das x

etc..