2017-02-22 46 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

不明白你对'OR'条件的意思。请提供样本输入和输出来解释这一点。如果你能解释你的业务规则,而不是期待我们从一些模糊的数据中推断出它们,那更好。也许作为矩阵?我意识到英语不是你的母语,但如果你清楚你的要求,我们只能帮助你。 – APC

+0

我的意思是,为什么'[item1,item2,item3,item4]'返回'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