2017-02-22 24 views
0

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

Проблема заключается в том, что в таблице есть поле, которое может содержать item1 or item2, но есть два обязательных аргумента, и алгоритм должен выберать между этими двумя, но поэтому он должен выглядеть как совпадение, которое может быть подходящим для других критерии одного и того же набора данных.

Пожалуйста, помогите, я застрял в этом пункте. Нахождение в соответствии с критериями, которые я выхожу и сложными - нет.

Например, данные и результаты: enter image description here

В настоящее время у меня есть три таблицы:

  1. Дисциплины;
  2. Специализации;
  3. Discipline_specializations.

, которые выглядят как этот

+-----------+ +---------------+ +---------------------------------------------------+ 
|disciplines| |specializations| |    discipline_specializations   | 
+----+------+ +---------------+ +----+---------------+-------------------+----------+ 
| id | name | | id | name | | id | discipline_id | specialization_id | priority | 
+----+------+ +----+----------+ +----+---------------+-------------------+----------+ 

Пожалуйста, помогите, у меня просто не знаю, как ее реализовать.
Спасибо!

ответ

0

Здесь, кажется, есть две проблемы.

Первый - это хранение данных. item3 or item4 нормализуется, поэтому вы должны разбить их на отдельные дисциплины с одинаковым приоритетом (если я понял ваш пример).

+---------------------------------------------------+ 
|    discipline_specializations   | 
+----+---------------+-------------------+----------+ 
| id | discipline_id | specialization_id | priority | 
+----+---------------+-------------------+----------+ 
| 1 | item1   | object1   |  1 | 
+----+---------------+-------------------+----------+ 
| 2 | item2   | object1   |  2 | 
+----+---------------+-------------------+----------+ 
| 3 | item3   | object1   |  3 | 
+----+---------------+-------------------+----------+ 
| 4 | item4   | object1   |  3 | 
+----+---------------+-------------------+----------+ 
| 5 | item5   | object2   |  1 | 
+----+---------------+-------------------+----------+ 
| 6 | item4   | object2   |  2 | 
+----+---------------+-------------------+----------+ 
| 7 | item2   | object2   |  3 | 
+----+---------------+-------------------+----------+ 
| 8 | item1   | object2   |  3 | 
+----+---------------+-------------------+----------+ 
| 9 | item1   | object3   |  1 | 
+----+---------------+-------------------+----------+ 
| 10 | item3   | object3   |  2 | 
+----+---------------+-------------------+----------+ 
| 11 | item6   | object3   |  3 | 
+----+---------------+-------------------+----------+ 
| 12 | item5   | object3   |  3 | 
+----+---------------+-------------------+----------+ 
| 13 | item2   | object4   |  1 | 
+----+---------------+-------------------+----------+ 
| 14 | item1   | object4   |  2 | 
+----+---------------+-------------------+----------+ 
| 15 | item4   | object4   |  1 | 
+----+---------------+-------------------+----------+ 
| 16 | item5   | object4   |  1 | 
+----+---------------+-------------------+----------+ 

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

select * from specializations s 
where s.specialization_id in (select ds.specialization_id 
           from discipline_specializations ds 
           where ds.discipline_id = 'item1') ; 

И это было бы запрос, чтобы найти соответствие специализации четыре дисциплины ...

select * from specializations s 
where s.specialization_id in (select ds.specialization_id 
           from discipline_specializations ds 
           where ds.discipline_id = 'item1') 
and s.specialization_id in (select ds.specialization_id 
           from discipline_specializations ds 
           where ds.discipline_id = 'item2') 
and s.specialization_id in (select ds.specialization_id 
           from discipline_specializations ds 
           where ds.discipline_id = 'item3') 
and s.specialization_id in (select ds.specialization_id 
           from discipline_specializations ds 
           where ds.discipline_id = 'item4') 
; 
+0

Спасибо за подсказку, я искал такой же результат, но другой метод, проблема в том, что в тех областях, где есть условие 'OR', обязательно Select выбрано именно одно. Этот пример не удовлетворяет «одному запросу», посмотрите внимательно, «первый запрос» не возвращает «Object2». Как достигается такой результат? – ladone

+0

Не понимаю, что вы имеете в виду о состоянии «ИЛИ». Просьба представить пример ввода и вывода, чтобы объяснить это. Еще лучше было бы, если бы вы могли объяснить свои бизнес-правила, а не ожидали, что мы выведем их из некоторых неясных данных. Возможно, в качестве матрицы? Я понимаю, что английский - это не ваш родной язык, но мы можем только помочь вам, если вы четко знаете свои требования. – APC

+0

Я имею в виду, почему '[item1, item2, item3, item4]' return 'object1', но не' object4'? Каково правило для этого? – APC

0

решить мою проблему:

SELECT d.name as discipline_name, s.name as specialization_name 
FROM pqh1s_enrolle_disciplines d 
LEFT JOIN pqh1s_enrolle_discipline_specializations ds ON ds.discipline_id = d.id 
LEFT JOIN pqh1s_enrolle_specializations s ON s.id = ds.specialization_id 
WHERE d.id IN (1, 2) 
GROUP BY s.id 
HAVING COUNT(DISTINCT ds.priority) = 2 
Смежные вопросы