三个表之间的SQL查询

时间:2016-06-28 17:54:33

标签: mysql sql sqlite

使用sqlite处理Android短信通知。

有三个名为

的表
people: `id`, `people_name` 
info: `id`,`info_name`
people_info: `auto-increment id`, 
      `people_id` <- foreign key (people.id)
      `info_id` <- foreign key (info.id)

当人们收到有关信息的通知后,people_info会添加两个ID。如何使WHERE子句检查人员被通知;如何过滤完全通知的人并防止通知冗余。

1 个答案:

答案 0 :(得分:1)

要从people获取与people相关的行和info中的特定行的行,您可以使用反连接< / em>模式。

例如:

SELECT p.id           AS `person_id`
     , p.people_name  AS `person_name`
  FROM people p
  LEFT
  JOIN people_info i
    ON i.people_id = p.id
   AND i.info_id =  ?
 WHERE i.people_id IS NULL
 ORDER BY p.id 

这不是返回此结果的唯一查询模式。还有其他几个,例如,使用NOT EXISTS和相关子查询:

SELECT p.id           AS `person_id`
     , p.people_name  AS `person_name`
  FROM people p
 WHERE NOT EXISTS ( SELECT 1
                      FROM people_info i
                     WHERE i.people_id = p.id
                       AND i.info_id =  ?
                  )
 ORDER BY p.id 

如果您想要返回所有不相关的(people,info)元组,而不仅仅是单个info,那么也可以实现。所提供的规范对于将要提供的值以及预期输出的示例是模糊的。上面的答案只解决了几种可能的解释中的一种。

如果我们想要涉及所有三个表格...以获取尚未收到通知的所有人的所有信息,我们可以使用反加入模式:

SELECT p.id           AS `person_id`
     , p.people_name  AS `person_name`
     , i.id           AS `info_id`
     , i.info_name    AS `info_name`
  FROM people p
 CROSS
  JOIN info i 
  LEFT
  JOIN people_info n
    ON n.people_id = p.id
   AND n.info_id =  i.id
 WHERE n.people_id IS NULL
 ORDER BY p.id, i.id