有没有人帮我想下 sql 语句怎么写来实现这个要求

2018-04-11 11:02:32 +08:00
 yuann72
两个数据表

学生表
id
stu_id

事务表
id
stu_id
stu_id_2

之前的写法大概是这样的,查询学生表的时候会返回几百条数据,这时执行整个函数就会查询了几百次数据库,想优化下

function 函数 ($学生 ID){
	$list = [];
	$ret = SELECT * FROM 学生表
	foreach ($ret as $item) {
		$学生 ID2 = $item['stu_id'];
		$结果 = SELECT COUNT(*) FROM 事务表 WHERE stu_id = $学生 ID AND stu_id_2 = $学生 ID2

		$list[] = [
			'学生 ID' => $学生 ID2,
			'结果' => $结果
		];
	}
	return $list;
}

有没有办法写一条 sql 语句实现一次查询满足要求,也就是一次查询返回

| 学生 ID   | 结果|
| :--------| --:|
| 123      | 10 |
| 456      | 20 |
| 789      | 30 |
1478 次点击
所在节点    问与答
8 条回复
yuann72
2018-04-11 11:03:59 +08:00
那个函数的实参只有一个 $学生 ID
多了个空格,忘记检查
ThirdFlame
2018-04-11 11:12:37 +08:00
联合查询 谢谢。 另外作业请自行完成。
yuann72
2018-04-11 13:26:05 +08:00
@ThirdFlame
发帖前就想了好久想用 left join , cross join , union 之类的方法来写. 但没想出来
刚才终于想出来用这种方法实现
```
SELECT *,(
SELECT COUNT(*) FROM 事务表 WHERE stu_id = $学生 ID AND stu_id_2 = 学生表.stu_id
) AS 结果 FROM 学生表
```
如果联合查询能实现的话, 能否告诉我? 我学习学习
还有这个并不是作业
liprais
2018-04-11 13:27:36 +08:00
没看懂到底想要啥
ourzhang
2018-04-11 13:45:47 +08:00
跟学生表有啥关系? 你最后想获得的就是你最后发出来的结果对吗? 如果你需要取得事务表所有数据的话直接 group by 事务表不就好了吗? 需要过滤的话用下学生表 exists 过滤一下。

SELECT stu_id,stu_id_2, COUNT(1) FROM 事务表 GROUP BY stu_id,stu_id_2
lzdhlsc
2018-04-11 13:48:45 +08:00
难道不是 inner join + group by ?
c6h6benzene
2018-04-11 14:01:05 +08:00
同上,不是 JOIN 事务表然后 COUNT,写好 GROUP BY 字段就好了?
binlinstar1
2018-04-11 14:59:45 +08:00
SELECT s.stu_id,COUNT(*) FROM student s left JOIN joins j on s.stu_id = j.stu_id
where j.stu_id2 = j.stu_id AND j.stu_id is not null group by j.stu_id

student 表为学生表
joins 表为事务表

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/445869

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX