Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IN()子句中的SQL查询_Sql_In Clause - Fatal编程技术网

IN()子句中的SQL查询

IN()子句中的SQL查询,sql,in-clause,Sql,In Clause,我有一个基于IN子句的SELECT查询,我想在该子句中添加其他查询,如: SELECT * FROM item_list WHERE itemNAME IN ( SELECT itemNAME FROM item_list WHERE itemID = '17' AND (itemSUB ='1' OR itemSUB ='0') ORDER BY itemSUB DESC LIMIT 1, SELECT itemNAME

我有一个基于IN子句的SELECT查询,我想在该子句中添加其他查询,如:

SELECT *
FROM item_list
WHERE itemNAME
IN (
    SELECT itemNAME
    FROM   item_list
    WHERE  itemID = '17'
    AND    (itemSUB ='1' OR itemSUB ='0')
    ORDER  BY itemSUB DESC
    LIMIT  1,
    SELECT itemNAME
    FROM   item_list
    WHERE  itemID = '57'
    AND    (itemSUB ='0' OR itemSUB ='0')
    ORDER  BY itemSUB DESC
    LIMIT  1
)
但它的错误在于:
1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解可在“从item_列表中选择itemNAME,其中itemID='57'和itemSUB='0'或第11行的”附近使用的正确语法。您要查找的语法是union all而不是limit:

但是,这可能不起作用,因为一些SQL引擎(尤其是MySQL)不允许对此类子查询进行限制。相反,您可以执行连接:

SELECT il.*
FROM item_list il join
     (select *
      from ((SELECT itemNAME
             FROM   item_list
             WHERE  itemID = '17' AND (itemSUB ='1' OR itemSUB ='0')
             ORDER  BY itemSUB DESC
             LIMIT  1
            ) union
            (SELECT itemNAME
             FROM   item_list
             WHERE  itemID = '57' AND (itemSUB ='0' OR itemSUB ='0')
             ORDER  BY itemSUB DESC
             LIMIT  1
            )
           ) l
     ) l
     on il.itemName = l.itemName;
这是另一种方法

SELECT *
FROM item_list
WHERE itemNAME
IN (
SELECT itemNAME
FROM   item_list
WHERE  
(itemID = '17'
AND    (itemSUB ='1' OR itemSUB ='0')
 )
OR
(
itemID = '57' AND    (itemSUB ='0' OR itemSUB ='0')
)

)
ORDER  BY itemSUB DESC
LIMIT  1
但是,除非您正在练习子查询,否则不需要子查询。你只需要这个:

SELECT *
FROM   item_list
WHERE  
(itemID = '17'
AND    (itemSUB ='1' OR itemSUB ='0')
 )
OR
(
itemID = '57' AND    (itemSUB ='0' OR itemSUB ='0')
)
ORDER  BY itemSUB DESC
LIMIT  1

用户:很好的回答:

SELECT *
FROM item_list
WHERE itemNAME
= ( SELECT itemNAME
    FROM   item_list
    WHERE  itemID = '17'
    AND    (itemSUB ='1' OR itemSUB ='0')
    ORDER  BY itemSUB DESC
    LIMIT  1)
OR itemName 
= ( SELECT itemNAME
    FROM   item_list
    WHERE  itemID = '57'
    AND    (itemSUB ='0' OR itemSUB ='0')
    ORDER  BY itemSUB DESC
    LIMIT  1
)

为什么在in声明中有Order By?它不会返回任何数据,ItemSub也不是您要查询的任何内容,因此这只是额外的处理时间。我甚至不确定是否允许……在限制查询时,可以在子查询中使用ORDER BY来确保返回正确的项。至少在SQL Server中是这样。删除重复项应该是UNION而不是UNION ALL。其中,在'foo'中的X,'foo'不会返回同一行两次。@MartinSmith。第一个语句和in没有区别,但第二个语句有区别。我当时正在考虑这个问题,但由于这些项目的细节不同,我猝不及防——当然,即使细节不同,名称也可能是相同的。
SELECT *
FROM item_list
WHERE itemNAME
= ( SELECT itemNAME
    FROM   item_list
    WHERE  itemID = '17'
    AND    (itemSUB ='1' OR itemSUB ='0')
    ORDER  BY itemSUB DESC
    LIMIT  1)
OR itemName 
= ( SELECT itemNAME
    FROM   item_list
    WHERE  itemID = '57'
    AND    (itemSUB ='0' OR itemSUB ='0')
    ORDER  BY itemSUB DESC
    LIMIT  1
)