【问题标题】:why my nested cursor displays twice the results?为什么我的嵌套光标显示两倍的结果?
【发布时间】:2019-08-01 04:37:00
【问题描述】:

我正在使用嵌套游标来检索许多不同人员的最后一小时工作。 为此,我首先在第一个游标中获取每个人的 ID,然后将 ID 发送到第二个游标,第二个游标为每个人的 ID 选择一个最大值(小时)。返回的值是正确的,但是显示的结果是重复的,除非我单独测试第一个游标时,每个id只显示一个结果。 也许答案很容易看到,但我做了很多尝试来解决它。谢谢你的帮助。 这是我的代码:

块1:

BEGIN
    DECLARE no_more_rows INT DEFAULT FALSE;
    DECLARE v_idChauffeur VARCHAR(7);

    DECLARE c_idChauffeur CURSOR FOR
        SELECT DISTINCT id_chauffeur FROM temp 
        RIGHT JOIN chauffeur 
        ON temp.logon = chauffeur.matricule_chauffeur
        WHERE logon IN (SELECT matricule_chauffeur from chauffeur)
        order by id_chauffeur;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE;

    OPEN c_idChauffeur;
        get_idChauffeur:LOOP
            FETCH c_idChauffeur INTO v_idChauffeur;
            IF no_more_rows THEN CLOSE c_idChauffeur;
            LEAVE get_idChauffeur;
            END IF;

块2:

BEGIN
DECLARE no_more_rows2 INT DEFAULT FALSE;
DECLARE v_maxHeure VARCHAR(20);

DECLARE c_maxHeure CURSOR FOR
    SELECT DISTINCT(max(heure)) as heure from temp
    right join chauffeur ON temp.logon = chauffeur.matricule_chauffeur
    where id_chauffeur = v_idChauffeur
    order by heure;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows2 = TRUE;

OPEN c_maxHeure;
    get_maxHeure:LOOP
        FETCH c_maxHeure INTO v_maxHeure;
        SELECT v_maxHeure,v_idChauffeur;
        IF no_more_rows2 THEN CLOSE c_maxHeure;
        LEAVE get_maxHeure;
        END IF;
    END LOOP get_maxHeure;
    END BLOCK2;
END LOOP get_idChauffeur;
END BLOCK1

以下是一些重复的结果:

v_maxHeure 23:02:17 v_idChauffeur 93
v_maxHeure 23:02:17 v_idChauffeur 93


v_maxHeure 23:24:12 v_idChauffeur 99
v_maxHeure 23:24:12 v_idChauffeur 99

v_maxHeure 15:19:28 v_idChauffeur 100
v_maxHeure 15:19:28 v_idChauffeur 100

感谢您的帮助

【问题讨论】:

  • 你为什么首先使用 2 个游标来获取可以通过简单的 SQL 指令轻松检索的数据?这看起来像是一场竞赛,用最复杂的系统来完成一项简单的任务。

标签: mysql nested cursors


【解决方案1】:

对于一个相当简单的数据库任务,代码看起来确实很复杂。 根据您的代码的假设,有两个表(临时和司机)与“temp.logon = chauffeur.matricule_chauffeur”连接。 现在您想要获取 Max(hour)(即 max(temp.heure))和 Person 的 ID(即 id_chauffeur)的不同记录。 我相信上述任务可以通过一个相当简单的查询来完成,如下所示。

SELECT DISTINCT(max(temp.heure)) as heure, temp.id_chauffeur
FROM temp INNER JOIN chauffeur ON temp.logon = chauffeur.matricule_chauffeur
ORDER BY temp.heure;

(注意:我刚刚通过试运行编译了查询,因为我没有表结构。希望它对你有用……干杯!)

【讨论】:

  • 您好,感谢您的回答。我已经测试了您建议的查询,但它不起作用。这就是发生的情况: QUERY : SELECT DISTINCT(max(temp.heure)) as heure, (chauffeur.)id_chauffeur FROM temp (RIGHT JOIN) chauffeur ON temp.logon = chauffeur.matricule_chauffeur ORDER BY temp.heure LIMIT 0, 30; MySQL 说“在没有 GROUP BY 的聚合查询中,SELECT 列表的表达式 #2 包含非聚合列 c1kpisteloi_dev.chauffeur.id_chauffeur 这与 sql_mode=only_full_group_by 不兼容”这就是我将其分开的原因光标
  • 您在添加 GROUP BY 子句后尝试了吗? SELECT DISTINCT(max(temp.heure)) as heure, temp.id_chauffeur FROM temp INNER JOIN chauffeur ON temp.logon = chauffeur.matricule_chauffeur GROUP BY temp.id_chauffeur ORDER BY temp.heure;
  • 嗨,是的,我做到了,但是没有用。无论如何谢谢 :D 我目前正在工作,所以我会更新我的问题以更准确
  • 不幸的是,我的时间有点短,所以我暂时搁置了。我终于在 php 中解决了它 - 没有重复。但请确保......当我找到这些重复的原因时,我会回来的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 2019-06-10
  • 2021-12-17
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多