2017-02-18 9 views
1

Я хочу получить записи из базы данных SQLite из 3 таблиц.SQLite Android JOIN query

Таблицы Структура
1. tb_contacts Таблица
Он содержит контактную информацию, как идентификатор, имя и адрес электронной почты.

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

2. tb_numbers Таблица
Он содержит номер телефона каждого контакта

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

3. tb_deleted таблица состояния
эту таблицу conatins статус контакта ли она удалена или нет с user_id , Если в этой таблице содержится строка контакта с определенным user_id, это означает, что контакт удалился для этого пользователя, иначе нет.

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

Что я хочу
1. Пусть пользователю 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  | 1 
---------- | ------------ | ------------------ | ------------- | ------- 
2   | Shivam  | [email protected] | 698521473  | 1 

2. Теперь пользователь с 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 

Что я попробовал

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; 

Она предоставляет мне запись каждого контакта с удаляемым статусом, но без user_id. Как я могу получить требуемые данные с условием user_id. Я использовал предложение WHERE, но при этом он предоставляет только записи тех контактов, для которых есть запись в таблице tb_deleted.
Каков наилучший способ или решение, чтобы я мог получить требуемые данные.

Спасибо.

ответ

1

Чтобы посмотреть будет ли удален пользователем, используйте 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

Hi CL., Он работает идеально.Ну, есть ли способ получить список контактов, имеющих одну строку каждого контакта с несколькими номерами телефонов, не с одной строкой каждого контакта с одним номером телефона? –

+0

С группировкой и [group_concat()] (http://www.sqlite.org/lang_aggfunc.html#groupconcat), но это был бы другой вопрос. –

+0

Спасибо. С group_concat() я могу получить требуемый результат. –

-1

Вы можете попробовать сделать запрос, как это:

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

попробовать с этим запросом:

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 

Результат:

enter image description here

с помощью перекрестного соединения может замедлить ход событий , вы можете попробовать использовать SELECT ..., (Выберите COUNT (*) FROM tb_deleted ГДЕ contact_id = deleted_contact_id и deleted_user_id = «2201») как удалённые FROM ..... не уверен, что если скорость быстрее или медленнее, хотя

 Смежные вопросы

  • Нет связанных вопросов^_^