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