2011-09-27 98 views
0

我正在为其中有25列以上的表进行搜索。其中两个是名字和姓氏。我可以让CONCAT单独搜索它们,但是当我添加其他OR选择时,我会收到错误。任何人都可以将我指向正确的方向吗?任何帮助都会很棒。 更多细节: 我特林这里算出这个..我有工作正常#1两个不同的SELECT statments是MYSQL/PHP/AJAX在多列上使用SELECT,CONCAT,OR和LIKE搜索

$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变量的方法吗?

+0

我不明白你正在尝试做。 #2。 – johnny

+0

你会得到什么错误?我们不能运行你的查询。 –

回答

0

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

更新

它似乎是在做我想要的东西,除非会有办法让全名变回来?

只需将它添加到SELECTSELECT ..., CONCAT_WS(' ',ContactFirstName,ContactLastName) AS FullName

再次,问题是别名不能在WHERE中使用。 有一些方法来对付它:

  1. 使用表达WHERESELECT ..., CONCAT_WS(' ',ContactFirstName,ContactLastName) AS FullName WHERE ... OR CONCAT_WS(' ',ContactFirstName,ContactLastName)
  2. 使用别名HAVINGSELECT ..., 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)."%'"; 
+0

你可以使用别名字段。这就是为什么他有'HAVING'关键字。请看MySQL使用手册。 –

+0

Bingo!太棒了。 – Mont

+0

MySQL允许在WHERE子句中使用别名字段。这是SQL标准的一个非常方便的扩展,否则不允许。 –

0

关于#1如果您在单引号之后放置空格会怎样? '“;换句话说所以你的SQL不在一起,也需要运行,适当的间距

,呼应你的SQL,并尝试一下吧,看看