V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yuann72
V2EX  ›  问与答

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

  •  
  •   yuann72 · 2018-04-11 11:02:32 +08:00 · 1381 次点击
    这是一个创建于 2204 天前的主题,其中的信息可能已经有所发展或是发生改变。
    两个数据表
    
    学生表
    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 |
    
    8 条回复    2018-04-11 14:59:45 +08:00
    yuann72
        1
    yuann72  
    OP
       2018-04-11 11:03:59 +08:00
    那个函数的实参只有一个 $学生 ID
    多了个空格,忘记检查
    ThirdFlame
        2
    ThirdFlame  
       2018-04-11 11:12:37 +08:00   ❤️ 1
    联合查询 谢谢。 另外作业请自行完成。
    yuann72
        3
    yuann72  
    OP
       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
        4
    liprais  
       2018-04-11 13:27:36 +08:00
    没看懂到底想要啥
    ourzhang
        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
    lzdhlsc
        6
    lzdhlsc  
       2018-04-11 13:48:45 +08:00
    难道不是 inner join + group by ?
    c6h6benzene
        7
    c6h6benzene  
       2018-04-11 14:01:05 +08:00
    同上,不是 JOIN 事务表然后 COUNT,写好 GROUP BY 字段就好了?
    binlinstar1
        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 表为事务表
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2900 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:27 · PVG 23:27 · LAX 08:27 · JFK 11:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.