2014-02-24 6 views
1

Я в настоящее время PHP функции (CodeIgniter), которая принимает строку запроса (от должности), и возвращает соответствующие строки MySQL, например:Как искать несколько столбцов с приоритетом в 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, он сначала возвращает третью строку. Но я хочу, чтобы аббревиатура являлась «основным» параметром.

Так что если аббревиатура совпадает, верните ее сначала, а затем найдите столбец заголовка.

Я думаю, что я могу сделать это с 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 столбцов, но только один столбец имеет приоритет, поэтому другие не важны по порядку.

Спасибо за помощь!

ответ

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; 
+0

вау. похоже большой. больше, чем я прошу, потому что я могу использовать этот рейтинг еще больше, например 1,2,3 и т. д. Но как насчет дублирующих строк? Является ли этот дубликат безопасным? – jeff

+0

Используйте ключевое слово DISTINCT в SELECT подзапроса, если вы считаете, что значения аббревиатуры или названия столбца могут иметь дубликаты в таблице данных. Слово предостережения, здесь столбец rnk будет иметь значение 1 или 2 только в зависимости от того, в каком столбце совпадало совпадение. Но если вы хотите ранжировать 1,2,3 ... ваши результаты запроса, я бы предложил вам задайте отдельный вопрос. –

+0

Да, конечно, я получил ранг. Но нет, моя таблица не имеет повторяющихся значений. И теперь я читаю ваш код более тщательно, и я думаю, что он будет работать нормально. Просто позвольте мне проверить его, а затем принять ваш ответ. Еще раз спасибо ! – jeff

Смежные вопросы