MySQL, альтернатива использованию IN, которая будет стоить первое значение? - PullRequest
1 голос
/ 14 марта 2011

Я пытаюсь использовать функцию IN (в моем PHP-скрипте), например.

WHERE Keywords.Word IN ('$search[0]','$search[1]',...)

Однако первое слово, которое я использовал, было уникальным в базе данных, а второе было очень популярным словом. Это не показало никакого результата для первого слова. У меня есть LIMIT 100 на конце.

В идеале я не хочу использовать AND, так как это ограничит результаты, поэтому OR кажется лучшим, я просто удивлен, что не оценил первое значение выше, чем другие.

Что я могу сделать?

Ответы [ 5 ]

1 голос
/ 14 марта 2011

Сложность объединяется с предложением LIMIT.Вы хотите, чтобы он работал хорошо, поэтому вам нужно получить максимум 100 из любой ветки.Наивный подход ранжирования всех строк с использованием CASE / IF приведет к полному сканированию таблицы.

SELECT * FROM (
    SELECT 1 as prec, column-list FROM table-list
    WHERE Keywords.Word = '$search[0]'
    LIMIT 100) A
UNION ALL
SELECT * FROM (
    SELECT 2 as prec, column-list FROM table-list
    WHERE Keywords.Word = '$search[1]'
    LIMIT 100) B
UNION ALL
SELECT * FROM (
    SELECT 3 as prec, column-list FROM table-list
    WHERE Keywords.Word = '$search[2]'
    LIMIT 100) C
ORDER BY prec
LIMIT 100;

Это может работать лучше для больших таблиц.

1 голос
/ 14 марта 2011

Похоже, вы можете просто отсортировать результаты по своему вкусу:

SELECT Keywords.KeywordsId, Keywords.Word
FROM Keywords
WHERE Keywords.Word IN ('foo', 'bar')
ORDER BY
CASE Keywords.Word 

    WHEN 'foo' THEN 1
    ELSE 2

END,
Keywords.Word -- Or any other criteria
LIMIT 100
1 голос
/ 14 марта 2011
ORDER BY CASE Keywords.Word
WHEN '$search[0]' THEN 1
WHEN '$search[1]' THEN 2
-- ...
ELSE 999
END
1 голос
/ 14 марта 2011
select *,if(word = 'some word',1,2) as relevance
from table
where word in ('some word','other word','another')
order by relevance
0 голосов
/ 14 марта 2011

Похоже, вам нужна функция FIND_IN_SET.

WHERE Keywords.Word IN ('$search[0]','$search[1]',...)
ORDER BY FIND_IN_SET(Keywords.Word,'$search[0],$search[1],...')

Однако существует ограничение, заключающееся в том, что условия поиска не могут содержать запятые. Если это ограничение, с которым вы можете жить, то это путь.

...