2014-11-30 2 views
0

на основе пользовательского ввода, который может быть один или несколько значений, и используя следующую таблицуСоздание многозначного поиска, борется с 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')); 

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

+0

Без каких-либо указаний, какая база данных используется, нет структуры таблицы и нет данных образца, трудно понять, что именно вы хотите достичь, - и еще сложнее предоставить вам полезный ответ. – Abecee

+0

@Abecee Извините! Это mysql Я нарисовал соответствующие части моей таблицы здесь http://i.imgur.com/er3GD9b.png, и пример будет (поиск: apple, grape returns: 1) (поиск: apple возвращает: 1 2) (поиск: виноград, возврат бананов: 3) –

+0

Спасибо за работу над вашим вопросом. Но, пожалуйста, попробуйте еще раз. Лучше выписать образцы данных вместо привязки к изображению. И ваш алгоритм выбора ключа, основанный на представленных значениях, по-прежнему выглядит размытым (помимо/возможно, из-за того, что последнее предложение было отрезано). – Abecee

ответ

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

Фантастический! Большое спасибо! Просто так, если кто-либо когда-либо найдет это эквивалент laravel, это $ results = DB :: table ('items') -> select ('seed') -> whereIn ('item', $ searchTerms) -> groupBy ('seed') -> иметь (DB :: raw ('count (item)'), '> =', $ num) -> get(); –

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