MySQL 中的 While 循环使用连接和子查询选择数据

Posted

技术标签:

【中文标题】MySQL 中的 While 循环使用连接和子查询选择数据【英文标题】:While Loop in MySQL to select data with join and subquery 【发布时间】:2022-01-11 21:29:42 【问题描述】:

我是 mysql 的初学者,我想使用 while 循环通过 select 语句从表中获取数据并通过子查询加入另一个表。

请帮我指导构建我的代码,下面是我写的代码,但总是有错误


DECLARE cn INT DEFAULT 0;
DECLARE tb INT DEFAULT 0;
SET tb = (SELECT COUNT(DISTINCT(exam_id)) FROM mais_writtenworks_detail);

WHILE cn <= tb DO
    SELECT ms.`first_name`,ms.`middle_name`, ms.`last_name`, rr.ww_score
    FROM mais_students ms
    LEFT JOIN
        (SELECT mwd.ww_score, mwd.`student_id`
        FROM mais_writtenworks_detail mwd
        WHERE mwd.`exam_id`= cn
        ) AS rr ON (ms.`ID`= rr.`student_id`)
        
    SET cn = cn + 1;
END WHILE;

这是桌子

我尝试过这种方法,但考试 ID 是动态的,所以我想使用循环

我需要你们的帮助,

【问题讨论】:

循环没有原因。事实上,任何时候您使用数据库(或任何基于集合的逻辑,例如 python Dataframe,作为另一个示例)并且您认为“我需要一个循环”,您都在朝着错误的方向前进。我相信循环内的 SQL 语句将按原样工作,只需运行一次,如果您从子查询中删除 WHERE mwd.exam_id= cn 只是为了进一步澄清。您的 exam_id 不是动态的。根据您的循环逻辑,您希望为mais_students 表中存在学生的每个exam_id 返回一条记录。所以不要在子查询中添加 where 子句,你会得到你想要的。 你好@JNevill,这是一个很好的答案。非常感谢您的见解。删除WHERE子句后的结果,第二个exam_id的值附加在表的底部,除了第一个exam_id的值之外,它需要在一个新的列中。 【参考方案1】:

你在想procedurally。但是,与大多数其他编程语言不同,SQL 是declarative。您描述您想要的一组东西,然后服务器将它们提供给您。

我相信这就是你想要的。您无需使用存储过程来获得它。

SELECT ms.ID, ms.`first_name`,ms.`middle_name`, ms.`last_name`, 
       mwd.exam_id, mwd.ww_score
  FROM mais_students ms
  LEFT JOIN mais_writtenworks_detail mwd
          ON mwd.student_id = ms.ID
 ORDER BY ms.ID, mwd.exam_id

您将获得一个结果集,每个学生每次考试一行。

如果您想为两个不同的考试设置两个单独的列,您必须对结果集执行所谓的pivot 操作。像这样。

SELECT ID, first_name, middle_name, last_name,
       MAX(IF(exam_id = 1, ww_score, null)) exam_1,
       MAX(IF(exam_id = 2, ww_score, null)) exam_2
  FROM (
         SELECT ms.ID, ms.`first_name`,ms.`middle_name`, ms.`last_name`, 
                mwd.exam_id, mwd.ww_score
           FROM mais_students ms
           LEFT JOIN mais_writtenworks_detail mwd
                    ON mwd.student_id = ms.ID
      ) detail
 GROUP BY ID, first_name, middle_name, last_name
 ORDER BY ID

在 SQL 中,旋转是 xxx 脖子上的一个臭名昭著的痛苦。

【讨论】:

以上是关于MySQL 中的 While 循环使用连接和子查询选择数据的主要内容,如果未能解决你的问题,请参考以下文章

使用mysql在python中的while循环中进行SELECT

mysql中,如何向测试人员介绍连接查询和子查询的优劣势?

带有连接和子查询的 mysql 查询优化

数据库(比如MYSQL) ,表连结查询与子查询哪个效率高些? 为啥

MySQL联表查询之连接和子查询

2020/6/20 mysql表连接和子查询