2

mysqlクエリで文字列を連結する際に問題があります。

ここに私のクエリがあります:

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%'

ただし、クエリは失敗します。 Query failed: Unknown column 'fullname' in 'where clause'

おそらく単なるシンタックスの間違いです、thx

4

7 に答える 7

5

WHERE 句でエイリアスを参照することはできません。

select_expr には、AS alias_name を使用してエイリアスを指定できます。エイリアスは式の列名として使用され、GROUP BY、ORDER BY、または HAVING 句で使用できます。

WHERE 句の実行時に列の値がまだ決定されていない可能性があるため、WHERE 句で列のエイリアスを参照することはできません。セクションC.5.5.4「列エイリアスの問題」を参照してください。

ソース

あなたは変えられる:

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

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

ちなみに、これらすべての LIKE により、クエリが非常に遅くなります。代わりに、全文検索を検討することをお勧めします。

于 2010-12-21T21:06:03.063 に答える
0

使用する :

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%'
于 2010-12-21T21:06:53.853 に答える
0

連結 独自の文字列 1 つのパラメーターは文字列で、2 つ目は CONCAT 関数のこのコードを使用して連結する列名です。

SELECT concat( 'ConcatString', columnName) AS newColumnName FROM productsWHERE 1 LIMIT 0 , 30

于 2014-02-07T06:36:24.883 に答える
0

シンタックスが私を殺している....

次のクエリにも問題があります。

$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";

エラー:

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
于 2010-12-21T21:26:27.393 に答える
0

出されたように、WHERE句で列の別名を使用することはできません。これは、WHERE値が見つかる前に句が使用されるためです。そのため、行が取得されるまで列エイリアスの式は計算されません。

SELECTここで、CONCAT を 2 回 ( で 1 回、で 1回) 実行する必要がない場合は、句WHEREを利用できます。HAVINGこのHAVING句は と同じように機能しますが、行が取得された後WHEREにのみ使用されます。

詳細: 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%'

最高のパフォーマンスを求めている場合、これが必ずしもうまくいくとは限らないことに注意してください。

于 2010-12-21T21:10:31.773 に答える
0

SELECT ステートメントで作成したフィールドに対して比較を行うことはできません。

使用する

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

ただし、これをエンジン向けに最適化することはおそらく不可能であるため、検索が非常に遅くなる可能性があることに注意してください。これが大量のデータの場合は、代わりに検索用に別の連結列を保持することを検討します。

于 2010-12-21T21:06:36.123 に答える
0

WHERE にも Concat() を入れる必要があります。

...place LIKE '%$busqueda%' OR CONCAT(nombre,' ',apellido) LIKE '%$busqueda%'
于 2010-12-21T21:06:44.627 に答える