0

我有一个难以解释的(mysql)sql查询问题:

我有一个存储参数值的数据库表,以及与参数值关联的案例 ID。

外键是parent_id,每个父级可以有可变数量的参数。

这意味着如果有三个参数,则有三行,四个参数,四行等。

同一个父级也可以有多个条目。我需要比较所有父参数的参数 VALUE,以获取案例 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 有两个 case id 的集合:

1234:参数 101 = 红色,参数 102 = 胡椒

3456 : 参数 101 = 绿色和参数 102 = 胡椒

第三个父母是另一个父母,碰巧有三个参数(它可能有更多!)

所以我会知道谁是父级,那个父级的参数 id,我将有参数值,我需要找到相应的案例 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)

但 :

  1. 仅使用 SQL,我无法弄清楚如何使用两个以上的内部连接来执行此操作(因此我无法对具有三个参数的粉红豹发出类似的请求)。我需要知道如何使用可变数量的参数进行 sql 查询。

  2. 我可以用 zend 中的原始 sql 做到这一点,但如果有某种方法可以用 php Zend 做到这一点,那么我全都听好了!

4

1 回答 1

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

于 2013-10-28T12:16:46.430 回答