【问题标题】:SQLite Android JOIN querySQLite Android JOIN 查询
【发布时间】:2017-02-18 14:58:02
【问题描述】:

我想从 3 个表的 SQLite 数据库中获取记录。

表格结构
1. tb_contacts 表
它包含联系信息,如 id、姓名和电子邮件。

contact_id | contact_name | contact_email
---------- | ------------ | ------------------
1          | Deepak       | deepak@yopmail.com
---------- | ------------ | ------------------
2          | Shivam       | shivam@yopmail.com

2。 tb_numbers 表
它包含每个联系人的电话号码

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

3。 tb_deleted 表状态
此表包含联系人的状态,无论是否删除,都带有 user_id。如果该表包含特定user_id的联系人行,则表示该联系人已为该用户删除,否则不删除。

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

我想要什么
1. 假设用户的 user_id 22201。它会得到所有的联系人,比如

contact_id | contact_name | contact_email      | contact_phone | deleted
---------- | ------------ | ------------------ | ------------- | -------
1          | Deepak       | deepak@yopmail.com | 123456789     | 1
---------- | ------------ | ------------------ | ------------- | -------
1          | Deepak       | deepak@yopmail.com | 789456123     | 1
---------- | ------------ | ------------------ | ------------- | -------
2          | Shivam       | shivam@yopmail.com | 456123654     | 1
---------- | ------------ | ------------------ | ------------- | -------
2          | Shivam       | shivam@yopmail.com | 698521473     | 1

2。现在是 user_id 22202 的用户。

contact_id | contact_name | contact_email      | contact_phone | deleted
---------- | ------------ | ------------------ | ------------- | -------
1          | Deepak       | deepak@yopmail.com | 123456789     | 1
---------- | ------------ | ------------------ | ------------- | -------
1          | Deepak       | deepak@yopmail.com | 789456123     | 1
---------- | ------------ | ------------------ | ------------- | -------
2          | Shivam       | shivam@yopmail.com | 456123654     | 0
---------- | ------------ | ------------------ | ------------- | -------
2          | Shivam       | shivam@yopmail.com | 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 表中有条目的联系人的记录。
什么是最好的方法或解决方案,以便我可以获得所需的数据。

谢谢。

【问题讨论】:

    标签: android database sqlite


    【解决方案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);
    

    【讨论】:

    • 嗨,CL,它完美地工作。那么有没有什么办法可以让每个联系人的一行有多个电话号码而不是每个联系人的一行有一个电话号码的联系人列表?
    • 使用分组和group_concat(),但这将是一个不同的问题。
    • 谢谢。使用 group_concat(),我能够得到所需的结果。
    【解决方案2】:

    试试这个查询:

    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
    

    结果:

    使用交叉连接可能会减慢速度,您可以尝试使用 SELECT ..., (Select COUNT(*) FROM tb_deleted WHERE contact_id = deleted_contact_id and deleted_user_id = '2201') as deleted FROM .....不确定如果速度更快或更慢

    【讨论】:

      【解决方案3】:

      您可以尝试执行如下查询:

      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
      );
      

      【讨论】:

        猜你喜欢
        • 2017-01-31
        • 2020-09-19
        • 1970-01-01
        • 2012-03-06
        • 2015-08-11
        • 1970-01-01
        • 1970-01-01
        • 2012-12-25
        • 2013-06-26
        相关资源
        最近更新 更多