我有一个难以解释的(mysql)sql查询问题:
我有一个数据库表,用于存储参数值,以及与参数值相关联的case id。
外键是parent_id,每个父键可以有可变数量的参数。
这意味着如果有三个参数,则有三行,四个参数,四行等。
同一父母也可以有多个条目。我需要比较所有父参数的参数VALUE,以获得case id。表格如下:
表格案例
id param_value param_id parent_id caseID
----------------------------------------------
1 red 101 200 1234
2 pepper 102 200 1234
3 green 101 200 3456
4 pepper 102 200 3456
5 pink 205 250 9875
6 panther 206 250 9875
7 fuzzy 207 250 9875
上面这个例子:有两种不同类型的父母:200和250。 200个案例有两个案例ID:
1234:param 101 =红色,param 102 = pepper
3456:param 101 = green,param 102 = pepper
第三个父母是另一个父母,碰巧有三个参数(它可能还有更多!)
所以我将知道父母是谁,父母的参数,我将拥有参数值,我需要找到相应的案例ID。
我可以使用两个参数来执行此操作,例如:
SELECT c1.caseId from case c1
INNER JOIN case c2 ON c1.caseId=c2.caseID
WHERE c1.param_id=101 and c1.param_value='red'
AND c2.param_id=102 and c1.param_value='pepper';
(返回caseId = 1234)
但是:
只使用SQL我无法弄清楚如何使用两个以上的内连接(因此我不能对有三个参数的粉红豹进行类似的请求)。我需要知道如何使用可变数量的参数进行sql查询。
我可以使用zend中的原始sql执行此操作,但如果有一些方法可以使用php Zend执行此操作,那么我全都是耳朵!
答案 0 :(得分:0)
假设case
表中存在约束:
CONSTRAINT UNIQUE (param_id, parent_id, caseID )
表示该表不能包含具有这三个字段相同值的重复行,例如以下情况不会发生:
id param_value param_id parent_id caseID
----------------------------------------------
1 red 101 200 1234
2 pepper 101 200 1234
然后可以使用以下查询为任意数量的参数检索case id
(以下是2个参数的示例):
SELECT caseID
FROM cas
WHERE (param_id, param_value) IN
(
(101,'red'),
(102,'pepper')
)
GROUP BY caseID
-- a number 2 below - is a number of parameters pairs within the IN clause
HAVING count(distinct param_id) = 2
演示 - > http://www.sqlfiddle.com/#!2/a9f4e/4