如何将表连接成n次?如果可能的话,还有Zend Db?

时间:2013-10-28 11:38:47

标签: mysql sql database zend-framework inner-join

我有一个难以解释的(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)

但是:

  1. 只使用SQL我无法弄清楚如何使用两个以上的内连接(因此我不能对有三个参数的粉红豹进行类似的请求)。我需要知道如何使用可变数量的参数进行sql查询。

  2. 我可以使用zend中的原始sql执行此操作,但如果有一些方法可以使用php Zend执行此操作,那么我全都是耳朵!

1 个答案:

答案 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