我目前有一个PHP函数(codeigniter),它接受一个查询字符串(来自post),并返回相关的MySQL行,如下所示:
$term = $this->input->post("query");
$rows = $this->db->query("SELECT id, title as 'desc' , abbreviation , etc FROM shows WHERE abbreviation LIKE '%".$term."%' OR title LIKE '%".$term."%' OR etc LIKE '%".$term."%' LIMIT 10; ")->result_array();
这有效,但我们可以说我的桌子是这样的:
id title abbreviation
-- ---------------------- ------------
1 The Big Bang Theory TBBT
2 How I Met Your Mother HMYM
3 a show called tbbt hmym ASCTM
现在,当用户搜索tbbt
时,它会先返回第3行。但我希望缩写成为“主要”参数。
因此,如果缩写匹配,请先返回,然后查找标题列。
我想我可以用PHP做到这一点:
// pseudo-code :
$abbreviation_matches = result("bla bla WHERE abbreviation LIKE term AND NOT title like term");
$title_matches = result("bla bla WHERE NOT abbreviation LIKE term AND title LIKE term");
$result = append($abbreviation_matches , $title_matches);
但我担心这不会那么高效,因为它涉及2个单独的SQL查询。那么有更有效的方法吗?最好是在一个查询中?
实际情况是4列,但只有一列具有优先权,所以其他列的顺序并不重要。
感谢您的帮助!
答案 0 :(得分:6)
它可能是解决方案之一:
SELECT id, desc, abbreviation, etc FROM
(
SELECT 1 AS rnk, id, title as 'desc' , abbreviation , etc FROM shows
WHERE abbreviation LIKE '%".$term."%'
UNION
SELECT 2 AS rnk, id, title as 'desc' , abbreviation , etc FROM shows
WHERE title LIKE '%".$term."%'
) tab
ORDER BY rnk
LIMIT 10;
或者您可以通过以下方式实现相同目标:
SELECT id, desc, abbreviation, etc FROM
(
SELECT CASE WHEN abbreviation LIKE '%".$term."%' THEN 1 ELSE 2 END As rnk,
id, title AS desc, abbreviation, etc
FROM shows
WHERE abbreviation LIKE '%".$term."%'
OR title LIKE '%".$term."%'
) tab
ORDER BY rnk
LIMIT 10;