2013-05-04 87 views
1

我有一個搜索選項的Drupal網站。如果用戶輸入搜索關鍵字,我需要將其與多個列進行比較並顯示記錄。Mysql喜歡與多個列的搜索

我曾嘗試下面的查詢

$search = 'test'; 

$sql_query = db_select('logoinfo', 'l')->fields('l'); 
$or = db_or(); 
$or->condition('search_field', '%'.db_like($search).'%','LIKE'); 
$or->condition('companyname', '%'.db_like($search).'%','LIKE'); 
$sql_query->condition($or); 
$selectlogos = $sql_query->execute(); 

它會顯示所有匹配與自動增量標識遞增的順序檢索關鍵字的記錄。

但我想先其具有與關鍵字既search_fieldcompanyname和顯示匹配的記錄,該其他記錄這是與後要麼companynamesearch_field或匹配。請告知實現這一點。

回答

1

由於orderBy需要一個字段名稱,不能通過表達式排序,所以需要使用addExpression來獲取別名,然後按該別名排序。如果該值不在兩個字段中,則在我的示例中的表達式將返回0,如果它在兩個字段中都將返回1。據我所知這應該是標準的SQL,但它可能會在不同的數據庫後端有所不同;所以表達式可能需要根據您使用的數據庫進行調整。

<?php 
$search = 'test'; 
$sql_query = db_select('logoinfo', 'l')->fields('l'); 
$or = db_or(); 
$or->condition('search_field', '%'.db_like($search).'%','LIKE'); 
$or->condition('companyname', '%'.db_like($search).'%','LIKE'); 
$sql_query->condition($or); 

$safe_search = db_like($search); 
$ex_alias = $sql_query->addExpression("l.search_field LIKE '%$safe_search%' AND l.companyname LIKE '%$safe_search%'"); 
$sql_query->orderBy($ex_alias, 'DESC'); 

$selectlogos = $sql_query->execute(); 
?> 
+0

謝謝。它的工作正常。 – lifeline 2013-05-06 04:14:10