2016-06-28 90 views
0

使用sqlite处理Android SMS通知。三个表之间的SQL查询

得到命名

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子句检查人员被告知;如何过滤完全通知的人员并防止通知冗余。

+0

可以添加样本数据集有助于低估 –

+0

查看示例表格图像?很少有样本数据 – Aelaf

+0

您可以将它附加到问题 –

回答

1

要想从people行那里是没有info与该people和特定行的行,你可以使用反连接模式。

例如:

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 
+0

好天啊!我肯定会思考你的sql智慧。非常感谢,我测试你的代码建议之前;-) – Aelaf

+0

谢谢你很多!只是最后一个问题,我想进一步检索不同的信息与非重复信息('i.id'),尝试'DISTINCT'。关键字,不起作用。 – Aelaf

+0

“DISTINCT”关键字(在“SELECT”关键字后面)适用于选择列表中的* all *表达式。如果你只想从'info'得到至少有一个'people'没有被通知的行,那么这个查询可以写成不同的形式。但要修改上面的示例查询,您可以从SELECT列表中删除对'p.'列的所有引用(即只返回'i.'列),然后添加DISTINCT关键字。但有更好的方法来获得你所追求的结果。没有预期结果集的例子,规范是不明确的,我们只是猜测你想要达到的目标。 – spencer7593