【问题标题】:MYSQL/PHP/AJAX Search using SELECT, CONCAT, OR and LIKE on multiple columnsMYSQL/PHP/AJAX 在多列上使用 SELECT、CONCAT、OR 和 LIKE 进行搜索
【发布时间】:2011-09-27 16:01:21
【问题描述】:

我正在搜索包含 25 列以上的表格。其中两个是名字和姓氏。我可以让 CONCAT 单独搜索它们,但是当我添加其他 OR 选择时,我会出错。谁能指出我正确的方向?任何帮助都会很棒。 更多细节: 我想在这里解决这个问题.. 我有两个运行良好的不同 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)."%'";

我一直无法弄清楚如何将第二个选择添加到第一个中。

---编辑--- 在 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做什么。
  • 您遇到什么错误?我们无法运行您的查询..

标签: php mysql ajax select concat


【解决方案1】:

如果我理解你的话,你正在尝试将WHERE ... OR FullName LIKE ... 添加到第一个查询中。它失败了,因为您不能在 WHERE 中使用字段别名。你需要做WHERE ... OR CONCAT_WS(' ',ContactFirstName,ContactLastName) LIKE ....

更新

它似乎在做我想做的事,除非有办法让 FullName 变量重新进入?

只需将其添加到 SELECTSELECT ..., 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
    ...)a
    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)."%'";

【讨论】:

  • 您可以使用别名字段。这就是为什么他有HAVING 关键字。查看 MySQL 手册中的用法。
  • MySQL 允许在 WHERE 子句中使用别名字段。这是对 SQL 标准的一个非常方便的扩展,否则就不允许这样做。
  • 您不能在WHERE 中使用别名。 An alias can be used in a query select list to give a column a different name. You can use the alias in GROUP BY, ORDER BY, or HAVING clauses to refer to the column: 来自dev.mysql.com/doc/refman/5.5/en/problems-with-alias.html
  • @N.B :如果您阅读了我的回答,我并没有提及 HAVING 中有效的别名。
  • 另外,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 来自dev.mysql.com/doc/refman/5.6/en/select.html
【解决方案2】:

在#1 上,如果在单引号后加一个空格怎么办? ' "; 换句话说,这样你的 sql 就不会一起运行,适当的间距。

另外,回显您的 SQL 并尝试查看它。

【讨论】:

    猜你喜欢
    • 2015-11-17
    • 2017-06-02
    • 1970-01-01
    • 2012-05-31
    • 2017-09-13
    • 2013-07-24
    • 1970-01-01
    • 2013-05-09
    • 2017-07-10
    相关资源
    最近更新 更多