IN

时间:2017-06-08 09:05:32

标签: mysql conditional-statements

我正在尝试根据第二张表中的值从第一张表中选择一堆行。

为了实现这一点,我提出了以下问题:

SELECT *

FROM table2 t2
WHERE t2.id IN(

    SELECT subquery.id

    FROM
    (

        SELECT id

        FROM table1 t1
        WHERE (t1.property=10 AND t1.value=0)

    ) AS subquery

    INNER JOIN
    (

        SELECT id

        FROM table1 t1
        WHERE (t1.property=20 AND i.value=1) 

    ) AS subquery2

    on subquery.id=subquery2.id

)

根据 table1 中的属性,将选择 id 的特定列表用作 table2 的最终 SELECT 的条件。

子查询本身正在运行,我测试了它,我可以检索到好的 id

+------+
|  id  |
|------|
|  18  |
|  55  |
¦      ¦

问题是, IN 无效,在最后的 SELECT 结束时,我检索了table2中的所有行,而不是那些尊重条件的行与先前检索的子查询相同的 id

+------+------+---
|  id  | name |
|------|------|---
|  1   |  xx  |
|  2   |  yy  |
¦      ¦      ¦

所以我的问题是:

  • 为什么在我的IN语句中忽略了子查询,是否有办法绕过这个问题?

修改

这是请求的SQLFiddle,但奇怪的是,我发布的代码在这里工作,但不适用于我的数据库。

2 个答案:

答案 0 :(得分:0)

SELECT * FROM table2 t2
INNER JOIN 
    (SELECT 
            subquery.id
        FROM
            (SELECT 
                id
            FROM
                table1 t1
            WHERE
                (t1.property = 10 AND t1.value = 0)) AS subquery
                INNER JOIN
            (SELECT 
                id
            FROM
                table1 t1
            WHERE
                (t1.property = 20 AND i.value = 1)) AS subquery2 ON subquery.id = subquery2.id)Z ON Z.id=t2.id

您可以尝试以上代码。 希望这会有所帮助。

答案 1 :(得分:0)

尝试如下;如果你在列中有任何空值,你就不会得到预期的结果。

common_id not in
(
  select common_id from Table1
  where common_id is not null
)

SQL "select where not in subquery" returns no results