Я пытаюсь объяснить, что я подразумеваю под матчи на простом примере:
У меня есть таблица myprods
вот так:
id | name 1 galaxy s4 mini 2 samsung galaxy s4 3 galaxy galaxy s3 4 iphone 4s 5 apple iphone 4s
У меня был бы такой запрос:
SELECT * FROM myprods WHERE name LIKE "%samsung%" OR name LIKE "%galaxy%" OR name LIKE "%s4%"
Результат моего запроса:
id | name 1 galaxy s4 mini 2 galaxy s4 3 galaxy galaxy s3
и теперь я бы не только возвращал согласованные строки, но и количество обращений. ОДИН хит будет, если ОДНИМ из LIKE-фраз относится к строке. Поэтому в этом случае я ожидал бы, что хиты будут равны 0, 1, 2 или 3. Это означает: выражение LIKE "%galaxy%"
НЕ следует считать двумя ударами для id = 3, это просто считается «ударом», или "не ударил".
Ожидаемый результат:
id | name | hits 1 galaxy s4 mini 2 2 samsung galaxy s4 3 3 galaxy galaxy s3 1
Возможно в выраженной фразе mysql? Или я должен выбрать только строки с моим запросом выше, а затем сопоставить отдельные подстроки с возвращаемыми именами через strpos
в PHP?
заранее спасибо
В MySQL логические выражения могут использоваться как целые числа – с 0 для false и 1 для true. Итак, следующие работы:
SELECT p.*, ((name LIKE '%samsung%') + (name LIKE '%galaxy%') + (name LIKE '%s4%')) as hits FROM myprods p WHERE name LIKE '%samsung%' OR name LIKE '%galaxy%' OR name LIKE '%s4%';
РЕДАКТИРОВАТЬ:
Если MySQL, вы также можете выразить этот запрос как:
SELECT p.*, ((name LIKE '%samsung%') + (name LIKE '%galaxy%') + (name LIKE '%s4%')) as hits FROM myprods p HAVING hits > 0;
Использование в этом контексте является расширением SQL и не работает в других базах данных. Но это позволяет запросу ссылаться на псевдоним столбца для фильтрации, не используя подзапрос.