2010-12-21 20 views
2

Ich habe ein Problem beim Verketten von String in einer MySQL-Abfrage.Concat() in mysql Abfrage

hier ist meine Frage:

SELECT *, CONCAT(nombre,' ',apellido) AS fullname FROM user WHERE nombre LIKE '%$busqueda%' OR apellido LIKE '%$busqueda%' OR email LIKE '%$busqueda%' OR about LIKE '%$busqueda%' OR place LIKE '%$busqueda%' or fullname LIKE '%$busqueda%' 

jedoch die Abfrage schlägt fehl: Query failed: Unknown column 'fullname' in 'where clause'

proabably ist nur ein sintax Fehler, thx

+2

Eine Menge Antworten. http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html – joksnet

Antwort

4

Sie keine Aliase in der WHERE-Klausel verweisen können.

A select_expr can be given an alias using AS alias_name. The alias is used as the expression's column name and can be used in GROUP BY, ORDER BY, or HAVING clauses.

It is not permissible to refer to a column alias in a WHERE clause, because the column value might not yet be determined when the WHERE clause is executed. See Section C.5.5.4, “Problems with Column Aliases”.

Source

Sie ändern können:

... OR fullname LIKE '%$busqueda%' 

zu

... or CONCAT(nombre,' ',apellido) LIKE '%$busqueda%' 

By the way, all diese mag gehen, um Ihre Abfrage sehr langsam machen. Vielleicht möchten Sie stattdessen in eine full text search suchen.

0

Sie können keinen Vergleich für ein Feld ausführen, das Sie in der SELECT-Anweisung erstellen.

Verwenden

or CONCAT(nombre,' ',apellido) LIKE %$busqueda%' 

bewusst sein, aber, dass dies wahrscheinlich nicht möglich ist, den Motor zu optimieren, so Suche wahrscheinlich ist sehr langsam. Wenn dies für größere Datenmengen gilt, würde ich in Erwägung ziehen, stattdessen eine separate verkettete Spalte für die Suche zu verwenden.

0

müssen Sie auch die Concat() in der WHERE setzen:

...place LIKE '%$busqueda%' OR CONCAT(nombre,' ',apellido) LIKE '%$busqueda%' 
0

Verwendung:

SELECT *, CONCAT(nombre,' ',apellido) AS fullname FROM user WHERE nombre LIKE '%$busqueda%' OR apellido LIKE '%$busqueda%' OR email LIKE '%$busqueda%' OR about LIKE '%$busqueda%' OR place LIKE '%$busqueda%' or CONCAT(nombre,' ',apellido) LIKE '%$busqueda%' 
0

Wie gebracht wurde aus nicht Spalte Aliase in einer WHERE Klausel verwenden können. Dies liegt daran, dass die Klausel WHERE verwendet wird, bevor Werte überhaupt gefunden werden. Daher werden die Ausdrücke in den Spaltenaliasen erst berechnet, nachdem die Zeile (n) abgerufen wurden.

Wenn Sie jetzt die CONCAT nicht zweimal ausführen müssen (eine in der SELECT, eine in der WHERE), können Sie die Klausel nutzen. Die HAVING-Klausel funktioniert genauso wie WHERE, nur wird sie verwendet nach die Zeilen abgerufen werden.

mehr lesen: http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html

SELECT *, CONCAT(nombre,' ',apellido) AS fullname FROM user WHERE nombre LIKE '%$busqueda%' OR apellido LIKE '%$busqueda%' OR email LIKE '%$busqueda%' OR about LIKE '%$busqueda%' OR place LIKE '%$busqueda%' HAVING fullname LIKE '%$busqueda%'

Beachten Sie, dass dies nicht unbedingt so gut funktionieren, wenn Sie für die beste Leistung suchen.

+0

Ja, außer dass, da weder nombre noch apellido selbst übereinstimmen, die Zeile, die mit dem vollständigen Namen übereinstimmen kann, von der ausgeschlossen wird WHERE-Klausel, und damit niemals zur have-Klausel. Du müsstest das Ganze auf "Haben" umstellen (kein WHERE). Aber das wäre wirklich ineffizient ... – ircmaxell

0

die sintax tötet mich ....

die nächste Abfrage, die Probleme zu:

$cadbusca="SELECT * , MATCH (nombre, apellido, email, about, place, CONCAT(nombre,' ',apellido)) AGAINST ('$busqueda') AS Score FROM user WHERE MATCH (nombre, apellido, email, about, place, CONCAT(nombre,' ',apellido)) AGAINST ('$busqueda') ORDER BY Score DESC"; 

Fehler:

Query failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(nombre,' ',apellido)) AGAINST ('dan stern') AS Score FROM user WHERE MATCH (nom' at line 1 
0

verketten Ihre eigene Zeichenfolge ein Parameter-String und zweite Spaltennamen, wo Sie wollen mit diesem Code verketten von CONCAT-Funktion

SELECT concat ('ConcatString', columnName) AS neuer Spaltenname FROM products WHERE 1 LIMIT 0, 30