我试图运行此查询,但它显示Subquery返回超过1行

时间:2014-01-31 19:09:16

标签: mysql

SELECT name
FROM test.projectusermap p
WHERE projectid IN(
    IF(1 = 1, (
        SELECT ProjectId
        FROM test.projectusermap
    ), (
        SELECT ProjectId
        FROM test.projectusermap
        WHERE name = 'ravi'
    ))
)

3 个答案:

答案 0 :(得分:0)

你需要这样的东西

SELECT name
FROM   test.projectusermap p
WHERE  projectid IN(SELECT ProjectId
                    FROM   test.projectusermap
                    WHERE  ( 1 = 1 ) /*I assume this boolean condition 
                                      is just a placeholder for testing
                                       and won't always be this*/
                            OR name = 'ravi') 

答案 1 :(得分:0)

我看到的第一个问题是IF 1=1然后它将是查询A的结果,查询A没有WHERE子句,所以它将返回Project表中的所有ProjectID。

否则它将返回'ravi'的项目ID,假设Ravi只有一个项目ID,它是该表的主键。

我认为您可以通过在查询A中放置WHERE子句来解决整个返回多行问题。

你的IF 1=1是在说ProjectID IN('1'),但你的子查询没有看到。在子查询之前,无论您的IF语句如何,因为子查询独立于您的初始WHERE子句和条件IF语句,您需要告诉查询A只返回ProjectID 1,其中ProjectID = 1,而不管您的IF语句是什么。

SELECT name
FROM test.projectusermap
WHERE projectid IN(
    IF(1 = 1, (
        SELECT ProjectId
        FROM test.projectusermap WHERE ProjectID = 1
    ), (
        SELECT ProjectId
        FROM test.projectusermap
        WHERE name = 'ravi'
    ))
)

另外,在projectusermap上取出了Alias,因为你没有将它与sub_query一起使用。

另一种说法是。

SELECT name FROM test.projectusermap WHERE projectID IN (SELECT ProjectID from test.projectusermap WHERE (1=1 or Name = Ravi) order by 1)

答案 2 :(得分:-1)

我认为JOIN可能会更好

SELECT name
FROM test.projectusermap p
JOIN test.projectusermap p2 ON p.projectid = p2.ProjectId
WHERE p2.name = 'ravi'