2013-08-30 29 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)