MYSQL / PHP / AJAX Поиск с использованием SELECT, CONCAT, OR и LIKE по нескольким столбцам - PullRequest
0 голосов
/ 27 сентября 2011

Я делаю поиск для таблицы, в которой более 25 столбцов.Два из них - это Имя и Фамилия.Я могу заставить CONCAT искать их в одиночку, но когда я добавляю другие ИЛИ выборки, я получаю ошибки.Может кто-то указать мне верное направление?Любая помощь будет отличной.Более подробно: я пытаюсь выяснить это здесь .. У меня есть две разные инструкции SELECT, которые работают нормально # 1 это

$query = "SELECT `CustomerID`, `CompanyName`, `ContactFirstName`, `ContactLastName`,
`BillingAddress`, `BillingAddress2`, `City`, `PostalCode`, `PhoneNumber`, `FaxNumber`, `EMail`
FROM `Customers` WHERE `CustomerID` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `CompanyName` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `ContactFirstName` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `ContactLastName` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `BillingAddress` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `BillingAddress2` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `PhoneNumber` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `EMail` LIKE '%".mysql_real_escape_string($search_text)."%'";

И № 2 это

SELECT *, CONCAT_WS(' ',ContactFirstName,ContactLastName) AS FullName FROM `Customers` HAVING
FullName LIKE '%".mysql_real_escape_string($search_text)."%'";

IНе удалось выяснить, как добавить второй выбор в первый.

--- EDIT --- После сообщения a1ex07 я переделал запрос, и он работает так, как я искал ...

$query = "SELECT `CustomerID`, `CompanyName`, `ContactFirstName`, `ContactLastName`, 
BillingAddress`, `BillingAddress2`, `City`,  `PostalCode`, `PhoneNumber`, `FaxNumber`, `EMail`
FROM `Customers`
WHERE `CustomerID` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `CompanyName` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `BillingAddress` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `BillingAddress2` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `City` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `PostalCode` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `PhoneNumber` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `FaxNumber` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `EMail` LIKE '%".mysql_real_escape_string($search_text)."%'
OR CONCAT_WS(' ',ContactFirstName,ContactLastName) LIKE 
'%".mysql_real_escape_string($search_text)."%'";

$query_run = mysql_query($query);
while ($query_row = mysql_fetch_assoc($query_run)) {
$CustomerID = $query_row['CustomerID'];
$CompanyName = $query_row['CompanyName'];
$ContactFirstName = $query_row['ContactFirstName'];
$ContactLastName = $query_row['ContactLastName'];
$BillingAddress = $query_row['BillingAddress'];
$BillingAddress2 = $query_row['BillingAddress2'];
$City = $query_row['City'];
$PostalCode = $query_row['PostalCode'];
$PhoneNumber = $query_row['PhoneNumber'];
$FaxNumber = $query_row['FaxNumber'];
$EMail = $query_row['EMail'];

echo $CustomerID.' '.$CompanyName.' '.$ContactFirstName.' '.$ContactLastName.'
'.$BillingAddress.' '.$BillingAddress2.' '.$City.' '.$PostalCode.' '.$PhoneNumber.' 
'.$FaxNumber.' '.$EMail.'<br>';

Кажется, я делаю то, что хочу, если только не будет способа вернуть обратно переменную FullName?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2011

On # 1 Что если вы поставите пробел после одинарной кавычки?'"; Другими словами, ваш sql не работает вместе, правильный интервал.

Кроме того, введите ваш SQL и попробуйте посмотреть на него, чтобы увидеть.

0 голосов
/ 27 сентября 2011

Если я вас правильно понял, вы пытаетесь добавить WHERE ... OR FullName LIKE ... к первому запросу. Сбой, потому что вы не можете использовать псевдонимы полей в WHERE. Вам нужно сделать WHERE ... OR CONCAT_WS(' ',ContactFirstName,ContactLastName) LIKE ....

Обновлено

Кажется, я делаю то, что хочу, если только не будет способа вернуть переменную FullName обратно?

Просто добавьте его к SELECT: SELECT ..., CONCAT_WS(' ',ContactFirstName,ContactLastName) AS FullName.

Еще раз, проблема в том, что псевдонимы нельзя использовать в WHERE. Есть несколько способов справиться с этим:

  1. Использовать выражение в WHERE: SELECT ..., CONCAT_WS(' ',ContactFirstName,ContactLastName) AS FullName WHERE ... OR CONCAT_WS(' ',ContactFirstName,ContactLastName)
  2. Использовать псевдоним в HAVING: SELECT ..., CONCAT_WS(' ',ContactFirstName,ContactLastName) AS FullName WHERE ... HAVING FullName ...
  3. Использовать производные таблицы:
    SELECT * FROM ( SELECT ..., CONCAT_WS(' ',ContactFirstName,ContactLastName) AS FullName<br> ...)a<br> WHERE ... OR FullName ....

Ваш окончательный запрос должен выглядеть следующим образом:

    $query = "SELECT `CustomerID`, `CompanyName`, `ContactFirstName`, `ContactLastName`, 
BillingAddress`, `BillingAddress2`, `City`,  `PostalCode`, 
 `PhoneNumber`, `FaxNumber`, `EMail`,  
 CONCAT_WS(' ',ContactFirstName,ContactLastName) AS FullName
FROM `Customers`
WHERE `CustomerID` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `CompanyName` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `BillingAddress` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `BillingAddress2` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `City` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `PostalCode` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `PhoneNumber` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `FaxNumber` LIKE '%".mysql_real_escape_string($search_text)."%'
OR `EMail` LIKE '%".mysql_real_escape_string($search_text)."%'
OR CONCAT_WS(' ',ContactFirstName,ContactLastName) LIKE 
'%".mysql_real_escape_string($search_text)."%'";
...