我的问题如下,我想在变量中设置ID列表,然后在子查询中使用此变量。问题是WorkBench(我的GUI)返回以下错误:"子查询返回多行"。在我看来,这就是我想要的。
请解释我错在哪里。
这是我的疑问:
set @listID := (select ID_VOIE as ID from voies
where ORIGINE = 'XXX'
group by CODE_INSEE, CODE_VOIE
having count(*) > 1);
select substring(v.CODE_INSEE,1,2), count(*) from voies v
where v.ID_VOIE in (@listID)
group by substring(vs.CODE_INSEE,1,2);
事情是我被"组阻挡了#34;我希望在第一组之后进行分组,这就是为什么我不能(或者至少我没有找到方法)使用单个WHERE子句编写请求。
事情是我知道我可以将整个请求直接放在我的子查询中而不是使用变量但是:
所以我寻求两种可能的方法:让我在子查询中的变量中使用列表的方式或者让我使用" group by"一次查询两次。
提前感谢您的回答(哦,对不起我的英语,这不是我的母语)。
答案 0 :(得分:1)
除非您需要其他内容的变量,否则您应该能够完全跳过它,如下所示:
SELECT
SUBSTRING(v.CODE_INSEE,1,2),
COUNT(*)
FROM
voies v
WHERE
v.ID_VOIE in
(SELECT
ID_VOIE as ID
FROM
voies
WHERE
ORIGINE = 'XXX'
GROUP BY
CODE_INSEE,
CODE_VOIE
HAVING COUNT(*) > 1)
GROUP BY
SUBSTRING(vs.CODE_INSEE,1,2);
正如您所说,子查询将针对所有行执行。为避免这种情况,变量最好,但MySQL不支持表变量。相反,您可以使用临时表:
IF EXISTS DROP TABLE myTempTable;
CREATE TEMPORARY TABLE myTempTable (ID_VOIE int); -- I don't know the datatype
INSERT INTO myTempTable (ID_VOIE)
SELECT DISTINCT -- using distinct so I can join instead of use IN.
ID_VOIE as ID from voies
WHERE
ORIGINE = 'XXX'
GROUP BY
CODE_INSEE, CODE_VOIE
HAVING COUNT(*) > 1
现在你可以这样做:
SELECT
SUBSTRING(v.CODE_INSEE,1,2), COUNT(*)
FROM
voies v
JOIN myTempTable tt ON
v.ID_VOIE = tt.ID_VOIE
GROUP BY SUBSTRING(vs.CODE_INSEE,1,2);