2017-02-18 4 views
1

Ich möchte die Datensätze aus SQLite-Datenbank von 3 Tabellen abrufen.SQLite Android JOIN Abfrage

Tabellen Struktur
1. tb_contacts Tabelle
Es die Kontaktinformationen enthält wie ID, Name und E-Mail.

contact_id | contact_name | contact_email 
---------- | ------------ | ------------------ 
1   | Deepak  | [email protected] 
---------- | ------------ | ------------------ 
2   | Shivam  | [email protected] 

2. tb_numbers Tabelle
Es die Telefonnummer jeden Kontakt enthält

id | contact_id | contact_phone 
---| ---------- | ------------ 
1 | 1   | 123456789  
---| ---------- | ------------ 
2 | 1   | 789456123  
---| ---------- | ------------ 
3 | 2   | 456123654  
---| ---------- | ------------ 
4 | 2   | 698521473 

3. tb_deleted Tabellenstatus
diese Tabelle conatins den Status des Kontakts, ob sie gelöscht wird oder nicht mit User_id . Wenn diese Tabelle die Kontaktzeile mit einer bestimmten Benutzer-ID enthält, bedeutet dies, dass der Kontakt für diesen Benutzer gelöscht wurde, andernfalls nicht.

id | contact_id | user_id 
---| ---------- | -------- 
1 | 1   | 22201  
---| ---------- | -------- 
2 | 1   | 22202  
---| ---------- | -------- 
3 | 2   | 22201  

Was ich
1. Angenommen, Benutzer möchten mit User_id . Es wird erhalten alle Kontakte wie

contact_id | contact_name | contact_email  | contact_phone | deleted 
---------- | ------------ | ------------------ | ------------- | ------- 
1   | Deepak  | [email protected] | 123456789  | 1 
---------- | ------------ | ------------------ | ------------- | ------- 
1   | Deepak  | [email protected] | 789456123  | 1 
---------- | ------------ | ------------------ | ------------- | ------- 
2   | Shivam  | [email protected] | 456123654  | 1 
---------- | ------------ | ------------------ | ------------- | ------- 
2   | Shivam  | [email protected] | 698521473  | 1 

2. Jetzt Benutzer mit User_id .

contact_id | contact_name | contact_email  | contact_phone | deleted 
---------- | ------------ | ------------------ | ------------- | ------- 
1   | Deepak  | [email protected] | 123456789  | 1 
---------- | ------------ | ------------------ | ------------- | ------- 
1   | Deepak  | [email protected] | 789456123  | 1 
---------- | ------------ | ------------------ | ------------- | ------- 
2   | Shivam  | [email protected] | 456123654  | 0 
---------- | ------------ | ------------------ | ------------- | ------- 
2   | Shivam  | [email protected] | 698521473  | 0 

Was ich

SELECT tb_contacts.contact_id, tb_contacts.contact_name, tb_contacts.contact_email, tb_numbers.contact_phone from tb_contacts join tb_numbers on tb_contacts.contact_id = tb_numbers.contact_id left join tb_deleted on tb_contacts.contact_id = tb_deleted.contact_id; 

versucht haben, es ist mir die Aufzeichnungen von jedem Kontakt mit gelöschten Status bereitstellt, aber ohne User_id. Wie bekomme ich die benötigten Daten mit der Bedingung user_id? Ich habe WHERE Klausel verwendet, aber damit nur die Datensätze der Kontakte, für die es einen Eintrag in tb_deleted Tabelle gibt.
Was ist der beste Weg oder Lösung, damit ich die erforderlichen Daten erhalten kann.

Danke.

Antwort

1

bis zu schauen, ob der Benutzer gelöscht wird, verwenden Sie ein correlated subquery:

SELECT contact_id, 
     contact_name, 
     contact_email, 
     contact_phone, 
     EXISTS (SELECT * 
       FROM tb_deleted 
       WHERE contact_id = tb_contacts.contact_id 
       AND user_id = 22201 
      ) AS deleted 
FROM  tb_contacts 
LEFT JOIN tb_numbers USING (contact_id); 
+0

Hallo CL., Es funktioniert perfekt.Gibt es eine Möglichkeit, die Liste der Kontakte zu erhalten, die eine Zeile jedes Kontakts mit mehreren Telefonnummern haben, und nicht eine Zeile jedes Kontakts mit einer Telefonnummer? –

+0

Mit Gruppierung und [group_concat()] (http://www.sqlite.org/lang_aggfunc.html#groupconcat), aber das wäre eine andere Frage. –

+0

Danke. Mit group_concat() kann ich das gewünschte Ergebnis erhalten. –

-1

Sie können versuchen, eine Abfrage wie dies zu tun:

SELECT tb_contacts.contact_id, tb_contacts.contact_name, tb_contacts.contact_email, tb_numbers.contact_phone, 
FROM tb_contacts 
JOIN tb_numbers ON tb_contacts.contact_id = tb_numbers.contact_id 
WHERE tb_contacts.contact_id NOT IN (
    SELECT tb_deleted.contact_id from tb_deleted WHERE tb_deleted.user_id = user_id 
); 
0

mit dieser Abfrage versuchen:

SELECT tb_contacts.*, contact_phone, deleted FROM(
SELECT tb_numbers.contact_id, tb_numbers.contact_phone, COUNT(tb_deleted2.user_id) as deleted FROM tb_numbers 
CROSS JOIN (SELECT DISTINCT tb_deleted.user_id FROM tb_deleted) as tb_deleted 
LEFT JOIN tb_deleted as tb_deleted2 ON tb_numbers.contact_id = tb_deleted2.contact_id and 
tb_deleted.user_id = tb_deleted2.user_id AND tb_deleted2.user_id = '22201' 
group by tb_numbers.contact_id, tb_numbers.contact_phone) as crossed_join 
LEFT JOIN tb_contacts ON tb_contacts.contact_id = crossed_join.contact_id 

Ergebnis:

enter image description here

mit Kreuz verbinden könnten Dinge verlangsamen , können Sie versuchen, SELECT ... zu verwenden, (Wählen Sie COUNT (*) FROM tb_deleted WO contact_id = deleted_contact_id und deleted_user_id = ‚2201‘) mit Wirkung vom ..... nicht sicher gelöscht, wenn die Geschwindigkeit schneller oder langsamer, obwohl