两个数据表
学生表
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 |
1
yuann72 OP 那个函数的实参只有一个 $学生 ID
多了个空格,忘记检查 |
2
ThirdFlame 2018-04-11 11:12:37 +08:00 1
联合查询 谢谢。 另外作业请自行完成。
|
3
yuann72 OP @ThirdFlame
发帖前就想了好久想用 left join , cross join , union 之类的方法来写. 但没想出来 刚才终于想出来用这种方法实现 ``` SELECT *,( SELECT COUNT(*) FROM 事务表 WHERE stu_id = $学生 ID AND stu_id_2 = 学生表.stu_id ) AS 结果 FROM 学生表 ``` 如果联合查询能实现的话, 能否告诉我? 我学习学习 还有这个并不是作业 |
4
liprais 2018-04-11 13:27:36 +08:00
没看懂到底想要啥
|
5
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 |
6
lzdhlsc 2018-04-11 13:48:45 +08:00
难道不是 inner join + group by ?
|
7
c6h6benzene 2018-04-11 14:01:05 +08:00
同上,不是 JOIN 事务表然后 COUNT,写好 GROUP BY 字段就好了?
|
8
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 表为事务表 |