MySQL-PHP-Abfrage HAVING-Klausel
Frage
Ich versuche, diese Abfrage zum Laufen zu bringen, erhalte jedoch die folgende Fehlermeldung:Unbekannte Spalte „zips.city“ in „haveing-Klausel“
`$query = "SELECT zips.* FROM zips HAVING zips.city LIKE '%$city%' AND zips.stateabbr LIKE '%$state%' LIMIT 1"; $result = mysql_query($query) or die (mysql_error());`
Meine Zip-Tabelle hat eine Stadtspalte, daher bin ich mir nicht sicher, wo das Problem liegt. Ich weiß, dass ich auf die Datenbank zugreife, weil ich diese Abfrage ohne Fehler ausführen kann:
$zip1query = "SELECT zips.* FROM zips WHERE zips.zip = '$zip' ";
Für jeden Rat wäre ich sehr dankbar!Danke!
Lösung
Die having
Klausel bedeutet nicht das Gleiche wie die where
Klausel: Wenn Sie eine einfache Abfrage ausführen, sollten Sie where
verwenden - das ist, was Sie in Ihrer zweiten Abfrage haben, dass Werke
having
wird verwendet, wenn der Zustand auf dem Ergebnis einer group by
Klausel angewandt werden muss.
Was bedeutet, dass, hier, Ihre Frage auf diese Weise gebaut werden sollte:
$query = "SELECT zips.*
FROM zips
where zips.city LIKE '%$city%'
AND zips.stateabbr LIKE '%$state%'
LIMIT 1";
Damit, wenn Sie noch eine Fehlermeldung über eine nicht vorhandene oder nicht-gefunden Spalte (zumindest für city
und / oder stateabbr
) , wird es sein, weil diese Spalte nicht in existiert IhrFormal Tabelle.
In diesem Fall gibt es nicht viel was wir tun können: Sie werden die Struktur der Tabelle zu überprüfen, um zu bestimmen, welche Spalten enthält
.Sie können diese Struktur überprüfen ein webbasiertes Tool wie phpMyAdmin verwenden, oder unter Verwendung einer SQL-Anweisung wie:
desc zips;
Als Referenz zitiert MySQL Handbuch Seite für select
:
Der SQL-Standard verlangt, dass HAVING Referenz muss nur Spalten in der
GROUP BY
Klausel oder Spalten verwendet in Aggregatfunktionen.
...
VerwendenHAVING
nicht für Gegenstände, die sollte in derWHERE
Klausel sein.
Zum Beispiel, schreiben Sie nicht die Folgendes ein:SELECT col_name FROM tbl_name HAVING col_name > 0;
Schreiben Sie stattdessen:
SELECT col_name FROM tbl_name WHERE col_name > 0;
...
DieHAVING
Klausel kann sich auf Aggregatfunktionen, die dieWHERE
Klausel kann nicht
Andere Tipps
Versuchen Sie es mit WHERE
anstatt HAVING
.
Der richtige Weg, es zu tun ist durch die Verwendung eines WHERE-Klausel.
$query = "SELECT
zips.*
FROM
zips
WHERE
zips.city LIKE '%$city%'
AND
zips.stateabbr LIKE '%$state%'
LIMIT 1";
hat, verwendet werden, wenn Sie Gruppierung finden Sie unter hier für eine Erklärung
o jeez sorry guys dachte ich, das Problem, habe ich anscheinend einen Raum vor Ort, wenn ich die Spalten in meiner Tabelle mit dem Namen. so i umbenannt die Spalte und es funktioniert trotzdem danke Burschen! aber mit der Funktion, wo stattdessen muss Geschwindigkeit Dinge von bis alot, Danke Jungs!