Создание многозначного поиска, борьба с SQL

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

+------+--------+
| seed |  item  |
+------+--------+
|    1 | apple  |
|    1 | grapes |
|    2 | apple  |
|    3 | grapes |
|    3 | banana |
+------+--------+

я хочу вернуться

  • 1, когда пользователь вошел (яблоко, виноград),
  • [1, 2] для (яблоко) и
  • ничего для (яблоко, банан).

Мой текущий код PHP

$keyword = Input::get('keyword');
$searchTerms = explode(",", $keyword);
$query = DB::table('items');
foreach($searchTerms as $term)
{
$query->where('item', 'LIKE', '%'.$term.'%');
}
$results  = $query->distinct()->get(array('seed'));

работает для отдельных значений. Итерируя в цикле, я просто добавляю больше поисковых терминов к текущему запросу $. В конце мне нужно найти пересечение всех запросов. В настоящее время это моя главная проблема.

0

Решение

При наличии входных данных попробуйте

SELECT seed
FROM Items
WHERE item IN ('apple', 'grapes')
GROUP BY seed
HAVING COUNT(item) >= 2
;

SELECT seed
FROM Items
WHERE item IN ('apple')
GROUP BY seed
HAVING COUNT(item) >= 1
;

SELECT seed
FROM Items
WHERE item IN ('apple', 'banana')
GROUP BY seed
HAVING COUNT(item) >= 2
;

Общее количество для сравнения в HAVING пункт — это количество товаров, которое вы проверяете в соответствующей партии.

SQL Fiddle

Пожалуйста, прокомментируйте, если требуется дополнительная детализация или корректировка.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]