2015-01-15 33 views
0

我有一个名为“proposition”的主表“idProposition”和一个名为“needs”的表“idProposition”和“idRequirement”列的MySQL表。我想得到的链接需求都在$ requireList php数组中。从多重条件请求中选择行

我试图做这样的:

$req = "SELECT idProposition FROM proposition 
     WHERE (SELECT idProposition FROM proposition 
       WHERE needs.idProposition = proposition.idProposition 
         AND idRequirement NOT IN($requireList)) 
      IS NULL"; 

但是,当我提出要求,我有以下错误:

#1242 - Subquery returns more than 1 row 

含义,它不能测试,如果结果(命题不需要在$ requireList中)是空的,因为有几个结果。 我如何测试内部SELECT是否提供结果?

感谢您的帮助。

+0

为什么不只是LIMIT 1?或者使用JOINS。 – Neat 2015-01-15 17:24:57

+0

查询的FROM子句中没有表“需要”。 – axiac 2015-01-15 17:35:57

回答

0

试试这个:

SELECT p.* 
FROM proposition p 
    INNER JOIN needs n ON n.idProposition = p.idProposition 
WHERE idRequirement IN (1, 7, 9) # blah, blah, blah, put your list here 
GROUP BY p.idProposition 
HAVING COUNT(idRequirement) = 3  # put the size of the list here 

做些什么:它SELECT一切都命题一起被喜欢与要求名单。如果只有一个需求被链接或全部都没有关系。那么它GROUP s那些行BY命题。每个命题将产生一行数据。然后它与这些行保持唯一的那些与列表大小相同数量的要求(即所有要求都存在)。

我没有测试它,但它应该工作。如果没有,只需将COUNT(idRequirement)添加到SELECT子句。

+0

不起作用,因为例如,没有要求的提议将不会被检测到,而其所有要求都在列表中。 – yopla 2015-01-15 18:30:49

+0

我发现一个相当脏但工作的解决方案基于你:我在数据库中添加了所有命题的要求0。 $ requireList从不包含0.并且我使用了“HAVING COUNT(idRequirement)= 1”,这样只剩下无法访问的条件。 – yopla 2015-01-15 18:40:50

0

使用

SELECT idProposition FROM proposition 
INNER JOIN needs on proposition.idProposition = needs.idproposition 

代替

SELECT idProposition FROM proposition 
     WHERE (SELECT idProposition FROM proposition 
       WHERE needs.idProposition = proposition.idProposition