2013-08-30 27 views
0

首先拼接效果,我需要得到精確匹配像SQL - 從2個表

SELECT * FROM movies WHERE title='STRING' ORDER BY x DESC 

,然後附加到與LIKE匹配

SELECT * FROM movies WHERE title LIKE '%STRING&' AND title<>'STRING' ORDER BY x DESC 

這些結果查詢與和最多10個限制這些結果結果。

UNION wont`t做的工作,因爲它的所有排序結果一起返回錯誤的順序(我需要精確匹配,然後再與LIKE)

SELECT * FROM movies WHERE title='STRING' UNION 
SELECT * FROM movies WHERE title LIKE '%STRING%' ORDER BY x DESC LIMIT 10 

我得到了最好的解決方案是使用multi_query()

$query = "SELECT * FROM movies WHERE title='STRING' ORDER BY x DESC; "; 
$query .= "SELECT * FROM movies WHERE title LIKE '%STRING%' AND title<>'red' ORDER BY x DESC"; 
$Dbi->multi_query($query); 
do { 
    $sql = $Dbi->store_result(); 
    while($x = $sql->fetch_array()) { 
     ... 
    } 
} while($Dbi->next_result()); 

但在這種情況下,不可能在內部循環中使用任何mysql,並且還必須有更好的解決方案!

回答

1

你不需要UNION,它的訪問同一個表兩次:

SELECT * 
FROM movies 
WHERE title LIKE '%STRING&' 
ORDER BY CASE WHEN title='STRING' THEN 1 ELSE 2 END 
LIMIT 10 
+0

只需在'LIMIT 10'之前添加',x DESC'。我更喜歡這個,因爲它使用'STRING'兩次,而@ gordon-linoff解決方案使用它3次 – user1612250

2

你可以用一個查詢做到這一點,利用order by子句:

SELECT * 
FROM movies 
WHERE title like '%STRING%' 
ORDER BY title = 'STRING' desc, 
     title like '%STRING%' desc 
LIMIT 10; 

ORDER BY的第一條首先將其完全匹配。然後第二個由部分匹配命令。 WHERE條款確保有某種匹配。

+0

只需要添加''前LIMIT,X DESC' 10'; – user1612250

0
(SELECT * FROM movies WHERE title='STRING') 
UNION 
(SELECT * FROM movies WHERE title LIKE '%STRING%' ORDER BY x DESC LIMIT 10)