mysql - 4张表的SQL查询: Very Complex?

标签 mysql sql database doctrine

我有四张 table

alert:
    * monitor_id
    * group_id

group:
    * group_id

user:
    * user_id
    * email

user_group:
    * group_id
    * user_id

是否可以仅使用 monitor_id 来获取用户的邮件?
如是!是否可能仅在一个查询中?
无论是通过sql查询还是 Doctrine ,请帮助我!

最佳答案

正确查询:

SELECT DISTINCT user.email FROM user 
inner join user_group on user.user_id=user_group.user_id 
inner join alert on  alert.group_id=user_group.group_id
where alert.monitor_id = provided_monitor_id

上一篇有 Shahbaz 的评论。
SELECT * FROM user inner join user_group on user.user_id=user_group.user_id 
inner join  group on user_group.group_id=group.group_id inner 
join alert on  alert.group_id=group.group_id
group by user.user_id

编辑(Shahbaz):帮助解释命令的工作原理:

当你有两个表共享一个字段(如果你喜欢一个变量),你可以join这两个表(也称为 inner join ),从而将两个表中的数据组合成一个更大的表(如果没有共享字段,您甚至可以这样做)。让我们用一个例子来看看:

表人员:字段:pid、pname、pjob

有条目
  • (0, '爱丽丝', '学生')
  • (1, 'Bob', '工厂 worker ')
  • (2, '克拉拉', '护士')

  • 表作业:字段:jname、jpay

    有条目
  • ('老师', 1000)
  • ('学生', 0)
  • ('工厂 worker ', 2000)

  • 现在如果你说People join Jobs你会得到一个有 9 个条目的表格,其中包含:

    字段:pid、pname、pjob、jname、jpay

    有条目
  • (0, '爱丽丝', '学生', '老师', 1000)
  • (0, '爱丽丝', '学生', '学生', 0)
  • (0, 'Alice', '学生', '工厂 worker ', 2000)
  • (1, '鲍勃', '工厂 worker ', '老师', 1000)
  • (1, '鲍勃', '工厂 worker ', '学生', 0)
  • (1, '鲍勃', '工厂 worker ', '工厂 worker ', 2000)
  • (2, '克拉拉', '护士', '老师', 1000)
  • (2, '克拉拉', '护士', '学生', 0)
  • (2, '克拉拉', '护士', '工厂 worker ', 2000)

  • 如您所见,这不是一张好 table !您可以使用 on join 中的条件提取彼此相关的信息。例如,我们可能想查看每个人的工资。因此,People.pjob 应该等于 Jobs.jname 所以,如果你说 People join Jobs on People.pjob=Jobs.jname你得到一张 table :

    字段:pid、pname、pjob、jname、jpay

    有条目
  • (0, '爱丽丝', '学生', '学生', 0)
  • (1, '鲍勃', '工厂 worker ', '工厂 worker ', 2000)

  • 请注意,Clara 的工作在 Jobs 表中不存在,因此她不在决赛 table 中。

    inner join为您提供来自匹配的两个表的数据,即使另一侧没有匹配项,您也可能希望获取表的数据。这称为 outer join .在此示例中 People outer join Jobs产生一个表

    字段:pid、pname、pjob、jname、jpay

    有条目
  • (0, '爱丽丝', '学生', '学生', 0)
  • (1, '鲍勃', '工厂 worker ', '工厂 worker ', 2000)
  • (2,“克拉拉”,“护士”,nullnull)
  • ( null , null , null , '老师', 1000)

  • 如果您只想要 outer join 左侧的表格即使不匹配也要包含在内,请使用 left outer join (在这种情况下,将出现“Clara”行而不是“teacher”行)。同样,right outer join给出右表中的行,即使不匹配,但不给出左表。

    最后,你一定已经知道了select确实,它只是从提供的列中返回一个包含选定列的表(* 选择所有列)。给定的表可能只是一个表的名称,或者是由 sql 命令形成的任何其他表(使用 select 命令本身创建的表(在这种情况下不要犹豫使用括号),使用 join 命令创建的表等)。如果您了解 SQL 的这种递归性质,您可以创建任意复杂的命令。试想一下,对表的每个操作都会产生另一个表,您可以简单地将其与其他操作结合使用,就好像该表是一个简单的存储命名表一样!

    关于mysql - 4张表的SQL查询: Very Complex?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7201578/

    相关文章:

    sql - 只显示那些有数据值的列

    mysql - 仅使用实体关系图查询 MYSQL 格式 [脑力挑战]

    mysql - 如何在mysql的Group_Concat中做求和,减法函数

    mysql - 这些 MySQL 索引是否重复?

    php - 用户相册和照片的数据库表结构

    php - 支付成功后验证新用户的最佳方式是什么?

    mysql - Woocommerce 3.0 相关产品过滤

    sql - 使用 > 比较列时出错

    java - SQLite 从 Java 执行 .import cmd

    c# - 如何使用 NHibernate 一次执行多个数据库更改?