Concat () в запросе MySQL - PullRequest
       18

Concat () в запросе MySQL

2 голосов
/ 22 декабря 2010

У меня возникла проблема с конкатенацией строки в запросе 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'

Вероятно, это просто синтаксическая ошибка, спасибо

Ответы [ 7 ]

4 голосов
/ 22 декабря 2010

Вы не можете ссылаться на псевдонимы в предложении 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 сделают ваш запрос очень медленным.Возможно, вы захотите вместо этого воспользоваться полнотекстовым поиском .

0 голосов
/ 07 февраля 2014

Конкатенация. Ваша собственная строка. Один параметр - это строка, а второй - имя столбца, в котором вы хотите выполнить конкатенацию, используя этот код функции CONCAT

SELECT concat ('ConcatString', columnName) AS newColumnName FROM productsГДЕ 1 ПРЕДЕЛ 0, 30

0 голосов
/ 22 декабря 2010

Синтаксис убивает меня ....

у следующего запроса тоже проблемы:

$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
0 голосов
/ 22 декабря 2010

Как выяснилось, вы не можете использовать псевдонимы столбцов в предложении WHERE. Это связано с тем, что предложение WHERE используется еще до того, как будут найдены какие-либо значения, поэтому выражения в псевдонимах столбцов не рассчитываются до тех пор, пока не будут получены строки.

Теперь, если вы не хотите выполнять CONCAT дважды (один в SELECT, один в 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%'

Обратите внимание, что это не обязательно работает, если вы ищете лучшее исполнение .

0 голосов
/ 22 декабря 2010

использование:

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 голосов
/ 22 декабря 2010

вам нужно поместить Concat () в ГДЕ также:

...place LIKE '%$busqueda%' OR CONCAT(nombre,' ',apellido) LIKE '%$busqueda%'
0 голосов
/ 22 декабря 2010

Вы не можете сделать сравнение для поля, которое вы создали в операторе SELECT.

Используйте

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

, хотя имейте в виду, что это, вероятно, невозможно оптимизировать для двигателяпоэтому поиск, скорее всего, будет очень медленным.Если это для больших объемов данных, я бы посоветовал сохранить отдельный объединенный столбец для поиска.

...