【问题标题】:sql queries between three tables三张表之间的sql查询
【发布时间】:2016-06-28 17:54:33
【问题描述】:

使用 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 子句检查人员被告知;如何过滤得到充分通知的人并防止通知冗余。

【问题讨论】:

  • 你能添加样本数据集吗?它将有助于undersatnd
  • 查看示例表图像?样本数据很少
  • 你能把它附加到问题中
  • @Aelaf 数据和代码绝不应作为图像包含在问题中。将您的数据复制/粘贴为文本,以便尝试回答的人可以使用实际数据。使用图片可能会使您的问题被否决,并使某些人无法参与提供答案。您可以单击问题下方的edit 链接(直接在 cmets 上方)将信息直接添加到您的问题中。
  • 谢谢先生!会记住这一点,但是如何在问题中添加包含数据的表格?

标签: mysql sql sqlite


【解决方案1】:

要从people 获取没有与people 相关的行以及info 中的特定行的行,您可以使用anti-join 模式。 p>

例如:

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,也可以实现。提供的规范对于将要提供的值以及预期输出的示例模棱两可。上面的答案只是解决了几种可能的解释中的一种。

如果我们想涉及所有三个表...以获取所有尚未通知的人的所有信息,我们可以使用 anti-join 模式:

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

【讨论】:

  • 天哪!我肯定会思考你的 sql 智慧。在我测试您的代码建议之前非常感谢;-)
  • 非常感谢!!!最后一个问题我想用非重复信息(i.id)进一步检索到不同的信息,尝试DISTINCT。关键字,不起作用。
  • DISTINCT 关键字(在SELECT 关键字之后)适用于选择列表中的所有 表达式。如果您只想要来自info 的行,其中至少有一个people 没有得到通知,则可以以不同的方式编写该查询。但是要修改上面的示例查询,您可以从 SELECT 列表中删除对 p. 列的所有引用(即仅返回 i. 列),然后添加 DISTINCT 关键字。但是有更好的方法来获得你想要的结果。如果没有预期结果集的示例,规范是模棱两可的,我们只是在猜测您要达到的目标。
猜你喜欢
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多