MSSQL und GROUP BY

milea

Mitglied
Hallo!

Ich weiß gar nicht, ob es nun mehr ins SQl oder doch ins php-Forum gehört....

Ich verbinde mich mittels mssql_connect auf einen SQL-Server.
In meiner php-Datei hab ich ein Formular mit 2 select-Listen. Die Werte in den Listen werden aus der DB gelesen.

PHP:
 # Auslesen der Auswahloptionen aus der Datenbank
                           $sql2 = "SELECT veranstalter, id FROM wert_tab GROUP BY veranstalter";
                           $result2 = mssql_query($sql2) OR die("<br>Anfrage von Variable SQL konnte nicht ausgeführt werden.");
                           $num2 = mssql_num_rows($result2)OR die('MSSQL-Fehler: ' . mssql_get_last_message());

                            echo '<option value="b" selected>keine Auswahl</option>';

                           #Schleife zum kompletten Auslesen
                         for($i = 0; $i<$num; $i++){
                           $veranstalter_id = mssql_result($result2,$i,'id');
                           $veranstalter_name = mssql_result($result2,$i,'veranstalter');
                                 if ($veranstalter == $veranstalter_id){

                                 echo '<option value="'.$veranstalter_id.'" selected>'.$veranstalter_name.'</option>';
                                 }
                                 else{
                                 echo '<option value="'.$veranstalter_id.'">'.$veranstalter_name.'</option>';
                                 }
Diese Group By - Abfrage funktioniert so aber nur bei mysql_query, nicht mit msssql_query.
Fehler:Die wert_tab.id-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist

Nach etlichen googeln bin ich zu dieser Lösung in der SQL-Abfrage gekommen:
PHP:
  $sql2 = "SELECT veranstalter, count(id) AS 'id' FROM bewertungen_tab GROUP BY veranstalter";

Nun werden mir zwar in der select-Liste keine in der DB doppelt vorhandenen Veranstalter ausgegeben, sondern alle werte nur einmal. Aber mein id stimmen nun beim Absenden des Formulars nicht mehr.

Wie kann ich das Problem lösen?
 
Zuletzt bearbeitet:
Ist es ein Schreibfehler das du dich in der ersten Abfrage ("wert_tab") auf eine andere Tabelle beziehst als in der zweiten ("bewertungen_tab")?

Wie sehen den die Einträge in der Tabelle aus und wie sollen sie ausgelesen werden?
 
hallo Milea,

wenn ich das richtig verstehe magst du Doppelbennenungen bei der DB-Ausgabe eliminieren. Dein Freund wäre dann DISTINCT. Verstehe aber das mit der for - Schleife so gar nicht bei dir.

$sql = "SELECT DISTINCT(veranstalter) AS v, id
FROM bewertungen_tab
GROUP BY veranstalter
";

$res = mysql_query($sql);
while ( $row = mysql_fetch_assoc($res) ) {

echo "Seite: " . $row['v'] . " mit der ID: " . $row['id'] . "<br />";

}

Finde hier leider nichts um den PHP-Code ordentlich zu posten. Ist das was du suchst?
Gruß
strolch_007
 
DISTINCT funktioniert aber nur dann so wie du es beschreibst wenn auch nur ein Feld ausgelesen wird. In der Abfrage von milea sind aber zwei Felder enthalten, dann geht das so nur bedingt.

Wollte deshalb auch wissen wie die Daten eingetragen sind und wie die Ausgabe gewünscht ist. Dann hätte ich das vielleicht auch vorgeschlagen.

Und PHP bekommst du indem du zuerst rechts auf "Erweitert" klickst und dann dann das entsprechende Symbol auswählst.
 
hallo nochmal,
danke tombe für den Hinweis. Man sieht das ich hier schon ewig nimmer war:) Bei dem
Ist es ein Schreibfehler das du dich in der ersten Abfrage ("wert_tab") auf eine andere Tabelle beziehst als in der zweiten ("bewertungen_tab")?
Siehste das hab ich in der "Hektik" gar nicht gesehen:)
Bei dem Code-Schnipsel tun sich mir sowieso mehr Fragen als Antworten auf.
Wo kommt in der "for Schleife" das $num her? seh nur eine Abfrage mit $num2.
Was/wer ist $veranstalter (If-Abfrage)?
$veranstalter in relation zu $veranstalter_id bzw. ist gleich**** Woher kommt $veranstalter? Wieso 2 mal select?
Habe den Code jetzt mal ein wenig verändert und bei mir getestet. Es werden nun im value die richtigen id's angezeigt. Sämtliche Veranstalter werden im drop-down nur einmal angezeigt. Die drop-down Anzeige starte bei jedem Seitenaufruf mit "keine Auswahl". Sorry milea wenn ich nun deinen schönen Code ein wenig verhunzt habe. Aber bei mir klappt das genau so zu 100%.
Hier mal meine Version:

PHP:
<?php
echo "<form action=\"#\" method=\"post\" accept-charset=\"utf-8\">\n";
echo "<select>\n";

 # Auslesen der Auswahloptionen aus der Datenbank
                           $sql2 = "SELECT veranstalter, id 
						   			FROM veranstalter 
									GROUP BY veranstalter";
                           $result2 = mysql_query($sql2) OR die("<br>Anfrage von Variable SQL konnte nicht ausgeführt werden.");
                           $num2 = mysql_num_rows($result2)OR die('MYSQL-Fehler: ' . mssql_get_last_message());

                            echo "<option value='b' selected>keine Auswahl</option>\n";

                           #Schleife zum kompletten Auslesen
                         for($i = 0; $i<$num2; $i++){
                           $veranstalter_id = mysql_result($result2,$i,'id');
                           $veranstalter_name = mysql_result($result2,$i,'site');
                                 echo "<option value=".$veranstalter_id.">".$veranstalter_name."</option>\n";
								 
}								 
echo "</select>\n";								 
echo "</form>\n";
?>

Bin halt "nur" von dem geposteten Code ausgegangen. Wenn es da noch irgendwo eine 2. Tabelle geben sollte die mit/dazu eingelesen werden soll (wie tombe evtl. richtig vermutet), dann stimmt mein geschreibsel natürlich nicht. Tabelle öffnen und schließen hab ich einfach mal so dazu gebastelt.
Gruß
strolch_007
 
Zuletzt bearbeitet:
orry ihr beiden - das mit dem verschiedenen Tabellen, kam durch verschiedene Dateien beim Code-kopieren zustande. Und das mit $num2 war ein Unachtsamkeitsfehler von mir - danke fürs darauf aufmerksam machen!

Trotzdem: ich habe den Code von strolch_007 probiert.

PHP:
 # Auslesen der Auswahloptionen aus der Datenbank
                           $sql2 = "SELECT veranstalter, id FROM bewertungen_tab GROUP BY veransatlter";
                           $result2 = mssql_query($sql2) OR die("<br>Anfrage von Variable SQL konnte nicht ausgeführt werden.");
                           $num2 = mssql_num_rows($result2)OR die('MSSQL-Fehler: ' . mssql_get_last_message());

                            echo "<option value='b' selected>keine Auswahl</option>\n";

                           #Schleife zum kompletten Auslesen
                         for($i = 0; $i<$num2; $i++){
                           $veranstalter_id = mssql_result($result2,$i,'id');
                           $veranstalter_name = mssql_result($result2,$i,'veranstalter');
                                  echo "<option value=".$veranstalter_id.">".$veranstalter_name."</option>\n";

                         }# Ende for-Schleife

Es geht nicht. das Problem liegt wirklich am mssql und Group By. Mit mysql funktioniert es.
@tombe:
DISTINCT geht - wie du sagst - auch nicht, weil ich ja 2 Werte auslese. Aber ich bin ja auf die id angewiesen, weil die die natürlich mit dem Formular weiterversende.
Gibt es noch weitere Vorschläge? Ich kann leider das übers WE nicht testen, da ich da nicht auf Arbeit bin ;) und so kein Zugriff auf den Server hab. Aber am Montag wieder..

Und vielen Dank euch beiden schon mal dafür, dass ihr euch mit meinen Problem beschäftigt.:)
 
halo milea,
stimmt ich arbeite mit mysql und damit klappt es natürlich. meine Kenntnisse mit mssql tendieren gegen null:)
Hab aber mal die allseits bekannte Suchmaschine ausgequetscht. das problem haben wohl Mehrere. Die Lösung scheint ein group by in verbindung mit having zu sein. Da ich mich wie gesagt mit mssql nicht auskenne hier mal der link mit scheinbar abschließender Lösung. Mußt du dir dann leider selber zusammen pfriemeln.

http://www.wer-weiss-was.de/theme10/article358546.html#358566

Gruß
strolch_007
 
Zurück