复杂的SQL组由选择查询组成

时间:2015-02-12 09:41:20

标签: mysql sql group-by

我有一个返回以下结果的查询:

user_id    contact_id      contact_id2
--------------------------------------
1          45              3
1          null            null
2          433             65
2          433             6789
2          433             5543
3          443             467
3          null            null
4          null            null
5          5564            12
5          null            null

我想调整查询以删除contact_id和contact_id2为null的所有行,但前提是该用户id的行不为null。

所以结果看起来像......

user_id    contact_id      contact_id2
--------------------------------------
1          45              3
2          433             65
2          433             6789
2          433             5543
3          443             467
4          null            null
5          5564            12

查看4的用户ID如何仍然具有空行,因为它没有'not null'结果。

我试过以下......

SELECT user_id, contact_id, contact_id2 FROM user_table
LEFT JOIN contact_table ON .......
LEFT JOIN contact2_table ON ........
GROUP BY user_id, contact_id, contact_id2
HAVING count(contact_id) > 0 OR (count(contact_id) = 0 AND count(user_id) > 1)

不知道我还能尝试什么。

原始查询很大,所以我希望你能够使用我放在这里的这个非常简化的版本......

EDIT ::

将HAVING子句设置为count(contact_id)> 0获取contact_id不为null的所有记录,但现在我需要添加不在此结果集中的所有其他用户。

2 个答案:

答案 0 :(得分:0)

这是一个想法...

 DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,user_id    INT NOT NULL
,contact_id      INT NULL
,contact_id2 INT NULL
);

INSERT INTO my_table (user_id,contact_id,contact_id2) VALUES
(1          ,45              ,3),
(1          ,null            ,null),
(2          ,433             ,65),
(2          ,433             ,6789),
(2          ,433             ,5543),
(3          ,443             ,467),
(3          ,null            ,null),
(4          ,null            ,null),
(5          ,5564            ,12),
(5          ,null            ,null);

SELECT DISTINCT x.user_id
              , y.contact_id
              , y.contact_id2
           FROM my_table x
           LEFT
           JOIN my_table y
             ON y.user_id = x.user_id
            AND y.contact_id IS NOT NULL;
+---------+------------+-------------+
| user_id | contact_id | contact_id2 |
+---------+------------+-------------+
|       1 |         45 |           3 |
|       2 |        433 |          65 |
|       2 |        433 |        6789 |
|       2 |        433 |        5543 |
|       3 |        443 |         467 |
|       4 |       NULL |        NULL |
|       5 |       5564 |          12 |
+---------+------------+-------------+

答案 1 :(得分:0)

请尝试以下查询。

select user_id,contact_id,contact_id2 from table where user_id in ( select   distinct user_id from table group by user_id having count(user_id)>1) and contact_id is not null;