【问题标题】:SQL joining other table with conditionSQL加入有条件的其他表
【发布时间】:2016-02-05 13:36:58
【问题描述】:

我有这个问题:

SELECT * 
FROM `classes` 
JOIN `classes_students` 
ON `classes`.`id` = `classes_students`.`class`

而且我需要添加条件以仅选择当前未登录的学生的班级(用户 ID 不在与班级 ID 连接的 classes_students 中),并计算该班级有多少学生。

表结构: 类:id、name 等 classes_students:class_id、user_id等

表格数据:

classes: 
1 | test 
2 | test2
3 | test3

classes_students:
1 | 1
1 | 2
2 | 3
3 | 4
3 | 5

如果是 id 为 1 的用户,则预期的输出: 班级名称(学生人数):

2 (1 student)
3 (2 students)

所有这些都在一个查询中。有可能的?如果是,如何?

【问题讨论】:

  • 可能。使用一些数据设置 SQLFiddle,我们可以帮助您解决问题。如果不知道表结构并查看您想要的输出示例,我们只会猜测。
  • 为什么要一个查询?向我们展示一些示例表数据以及您希望从该查询中获得的结果。
  • 示例数据已添加,谢谢。

标签: php mysql sql


【解决方案1】:
Select classid, count(*)
from class
  left join student on student.classid = class.classid
group by classid

很高兴为您提供帮助

【讨论】:

  • 这显示了我所在的班级。但我想显示其他班级(我不在的地方)。
  • 您应该在 group by 之前添加 where class.classid not in (1,2,3,..)
【解决方案2】:

试试这个查询:

$user_id = 1; // current user_id

$query = "SELECT `classes`.`id`, `classes`.`name`, COUNT(*) as students FROM `classes` 
          JOIN `classes_students` 
          ON `classes`.`id` = `classes_students`.`class_id`
          AND `classes_students`.`user_id` != $user_id 
          GROUP BY `classes_students`.`class_id`
          ";

【讨论】:

  • 是的,它正在工作,但是当我的班级是其他学生时,该班级也会出现。这不是我所期望的。
  • @JeleanThomas,不太明白这一点“但是当我的班级是其他学生时,那个班级也会出现”。我以为您想提取与当前登录用户无关的类。上面的查询应该得到所有与当前用户没有关系的类
  • 是的,我想要。但是,当所选班级的 classes_students 中有另一条记录与实际登录用户不同时,它会显示出来。你可以自己试试。 :)
【解决方案3】:

我想通了! :) 谢谢你们的帮助。

$user_id = 1; // current user_id

$query = "SELECT `classes`.`id`, `classes`.`name`, COUNT(*) as students FROM `classes` 
          LEFT JOIN `classes_students` 
          ON `classes`.`id` = `classes_students`.`class_id`
          WHERE `classes`.`id` NOT IN (SELECT `class_id` FROM `classes_students` WHERE `user_id`='.$user_id.')
          GROUP BY `classes_students`.`class_id`
          ";

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2015-03-28
    • 2018-04-15
    • 1970-01-01
    相关资源
    最近更新 更多