在子查询中设置变量列表 - MYSQL

时间:2017-06-06 08:59:23

标签: mysql

我的问题如下,我想在变量中设置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子句编写请求。

事情是我知道我可以将整个请求直接放在我的子查询中而不是使用变量但是:

  • 它可以让我在另一个需要此行为的请求中使用此技巧(DRY概念!)
  • 我不确定,但子循环将在循环的每个回合中执行,这将是非常低效的

所以我寻求两种可能的方法:让我在子查询中的变量中使用列表的方式或者让我使用" group by"一次查询两次。

提前感谢您的回答(哦,对不起我的英语,这不是我的母语)。

1 个答案:

答案 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);