2016-06-28 93 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