IN()子句中的SQL查询
我有一个基于IN子句的SELECT查询,我想在该子句中添加其他查询,如: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
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
)