2016-11-26 3 views
1

У меня есть таблица, как этотнесколько переменных назначения с одной колонкой, как результат

+----+------+ 
| ID | Name | 
+----+------+ 
| 0 | Foo | 
| 1 | Bar | 
+----+------+ 

на основе таблицы строк, которые я хочу, чтобы вычислить рейтинг на основе каждой строки, так что запрос как

SELECT *, [calculation] AS ranking 
FROM table 
ORDER BY ranking DESC 

возвращает что-то вроде

+----+------+---------+ 
| ID | Name | Ranking | 
+----+------+---------+ 
| 0 | Bar |  3 | 
| 1 | Foo |  1 | 
+----+------+---------+ 

Моя проблема в том, что мне нужно выполнить несколько заданий на строку без получения большего количества столбцов; в основном что-то вроде

@ranking:= 0 
IF(Name LIKE $firstTerm, @ranking := @ranking + 1, @ranking := @ranking) 
IF(Name LIKE $secondTerm, @ranking := @ranking + 1, @ranking := @ranking) 
IF(Name LIKE $thirdTerm, @ranking := @ranking + 1, @ranking := @ranking) 

Для каждой строки, так что в конце концов у меня есть либо 0, 1, 2 или 3, как один дополнительный столбец для каждой записи в моей таблице

EDIT: В теории динамически генерируемый запрос, как

SELECT * 
FROM table 
ORDER BY SUM(
    CASE 
    WHEN 
     (NAME LIKE $firstTerm AND NAME NOT LIKE $secondTerm AND NAME NOT LIKE $thirdTerm) 
     OR (NAME NOT LIKE $firstTerm AND NAME LIKE $secondTerm AND NAME NOT LIKE $thirdTerm) 
     OR (NAME NOT LIKE $firstTerm AND NAME NOT LIKE $secondTerm AND Name LIKE $thirdTerm) THEN 1 
    WHEN (Name LIKE $firstTerm AND Name LIKE $secondTerm AND Name NOT LIKE $thirdTerm) 
    OR (Name NOT LIKE $firstTerm AND Name LIKE $secondTerm AND Name LIKE $thirdTerm) THEN 2 
    WHEN (Name LIKE $firstTerm AND Name LIKE $secondTerm AND Name LIKE $thirdTerm) THEN 3 
    ELSE 0 
) DESC; 

будет работать так, как ожидалось, но вы, вероятно,

+0

Расскажите нам о том, что расчет – Strawberry

+0

Это должно быть несколько LIKE сравнения, поэтому чем больше матчей он, тем выше она занимает – RoiEX

+0

@Strawberry отредактированные мой вопрос будет более правильно (добавлено LIKE пример заявление) – RoiEX

ответ

2
SELECT *, 
    IF(Name like $firstTerm, 1, 0) + 
    IF(Name like $secondTerm, 1, 0) as Ranking 
    FROM table ORDER BY Ranking DESC; 

Однако, если набор данных становится большим, и расчет комплекса, используя поисковую систему (elasticsearch, Solr) будет более эффективным и более гибким.

+0

Это именно то, что мне нужно! Благодаря! Должен был подумать об этом! – RoiEX

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