By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE tab1 (
`id` INTEGER,
`cluster_id` int,
`user_id` INTEGER,
`name` VARCHAR(20)
);
INSERT INTO tab1
(`id`, `cluster_id`, `user_id`, `name`)
VALUES
('1', '1', '1', 'test name'),
('2', '1', '3', 'other'),
('3', null, '1', 'one more'),
('4', '2', '1', 'foo'),
('5', null, '1', 'bar'),
('6', '1', '1', 'baz');
SELECT * FROM tab1 WHERE `id` IN (SELECT MIN(`id`) FROM tab1 GROUP BY `cluster_id`,`user_id`)
UNION
SELECT * FROM tab1 WHERE `cluster_id` IS NULL
id | cluster_id | user_id | name |
---|---|---|---|
1 | 1 | 1 | test name |
2 | 1 | 3 | other |
3 | null | 1 | one more |
4 | 2 | 1 | foo |
5 | null | 1 | bar |
SELECT * FROM tab1 WHERE `id` IN (SELECT MIN(`id`) FROM tab1 WHERE `cluster_id` IS NOT NULL GROUP BY `cluster_id`,`user_id`)
UNION
SELECT * FROM tab1 WHERE `cluster_id` IS NULL
id | cluster_id | user_id | name |
---|---|---|---|
1 | 1 | 1 | test name |
2 | 1 | 3 | other |
4 | 2 | 1 | foo |
3 | null | 1 | one more |
5 | null | 1 | bar |
SELECT * FROM tab1 WHERE `id` IN (SELECT MIN(`id`) FROM tab1 GROUP BY `cluster_id`)
UNION
SELECT * FROM tab1 WHERE `cluster_id` IS NULL
id | cluster_id | user_id | name |
---|---|---|---|
1 | 1 | 1 | test name |
3 | null | 1 | one more |
4 | 2 | 1 | foo |
5 | null | 1 | bar |
SELECT * FROM tab1 WHERE `id` IN (SELECT MIN(`id`) FROM tab1 WHERE `cluster_id` IS NOT NULL GROUP BY `cluster_id`)
UNION
SELECT * FROM tab1 WHERE `cluster_id` IS NULL
id | cluster_id | user_id | name |
---|---|---|---|
1 | 1 | 1 | test name |
4 | 2 | 1 | foo |
3 | null | 1 | one more |
5 | null | 1 | bar |