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