表格结构和价值如下:
malloc
下一个查询选择我知道CREATE TABLE IF NOT EXISTS `docs` (
`id` int(11) NOT NULL,
`id_sub` int(11) NOT NULL,
`id_obj` int(11) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `docs` (`id`, `id_sub`, `id_obj`) VALUES
('1','1', '1'),
('2','1', '2'),
('3','1', '3'),
('4','1', '10'),
('5','1', '1'),
('6','1', '10'),
('7','1', '3'),
('8','1', '10'),
('9','1', '1'),
('10','2', '30'),
('11','2', '10'),
('12','2', '1'),
('13','2', '10'),
('14','4', '1'),
('15','5', '1'),
('16','6', '1'),
('17','7', '1'),
('18','7', '10'),
('19','7', '11');
和id_sub
具有相同值的行:
id_obj
结果:
SELECT
*
FROM docs
WHERE `id_sub` IN (1,2,7)
AND `id_obj` IN (SELECT `id_obj` FROM `docs` GROUP BY 1 HAVING count(*)>1)
但我无法选择我知道 id | id_sub | id_obj
1 | 1 | 1
3 | 1 | 3
4 | 1 | 10
5 | 1 | 1
6 | 1 | 10
7 | 1 | 3
8 | 1 | 10
9 | 1 | 1
11 | 2 | 10
12 | 2 | 1
13 | 2 | 10
17 | 7 | 1
18 | 7 | 10
的行,其中所有 id_sub
具有相同的值,即我无法获得下一个结果:
id_obj
表有~20k行, id | id_sub | id_obj
1 | 1 | 1
4 | 1 | 10
11 | 2 | 10
12 | 2 | 1
17 | 7 | 1
18 | 7 | 10
的计数值可能不同。
有什么想法吗?
UPD - 说明条件
我知道条件IN()
的值 - 1,2或7(示例)
我不知道价值id_sub
预期结果的条件:
id_obj
1,2或7 id_sub
& id_sub
,即id_sub
= 1且id
= 5的行是dublicate(请参阅值行),结果可以只有一行id
= 1(如果行重复需要返回第一个重复行) id
值应该在每行结果中,即:
现在结果我有:
id | id_sub | id_obj
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
正如我们在此行中看到的那样,只有id_obj
= 1的行具有id
值,其中包含其他行:
id_obj
对于所有表格,我想获得下一个结果:
答案 0 :(得分:2)
我在这里找到了一个正在运行的查询。
SELECT MIN(a.id) AS id, a.id_sub, a.id_obj
FROM docs a
JOIN (
SELECT id_obj
FROM docs
WHERE id_sub IN (1,2,7)
GROUP BY id_obj
HAVING COUNT(DISTINCT id_sub) = 3
) b
ON a.id_obj = b.id_obj
WHERE id_sub IN (1,2,7)
GROUP BY a.id_sub, a.id_obj
但我不确定这是最好的解决方案
太多的子查询我客人。但总比没有好。
希望这有帮助。
答案 1 :(得分:0)
要获得结果,我认为您希望源数据必须
drop table if exists docs;
CREATE TABLE IF NOT EXISTS `docs` (
`id` int(11) NOT NULL,
`id_sub` int(11) NOT NULL,
`id_obj` int(11) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `docs` (`id`, `id_sub`, `id_obj`) VALUES
('1','1', '1'),
('2','1', '2'),
('3','1', '3'),
('4','1', '10'),
('5','1', '1'),
('6','1', '10'),
('7','1', '3'),
('8','1', '10'),
('9','1', '1'),
('10','2', '30'),
('11','2', '10'),
('12','2', '1'),
('13','2', '10'), (20,2,'1'),
('14','4', '1'),
('15','5', '1'),
('16','6', '1'),
('17','7', '1'), (21,7,1),
('18','7', '10'), (22,7,10),
('19','7', '11');
产生预期结果的代码
select min(id) id ,id_sub,id_obj
from docs
#where id_sub = 1
group by id_sub,id_obj
having count(*) > 1
;
+------+--------+--------+
| id | id_sub | id_obj |
+------+--------+--------+
| 1 | 1 | 1 |
| 3 | 1 | 3 |
| 4 | 1 | 10 |
| 12 | 2 | 1 |
| 11 | 2 | 10 |
| 17 | 7 | 1 |
| 18 | 7 | 10 |
+------+--------+--------+
7 rows in set (0.00 sec)
答案 2 :(得分:0)
我认为你只是在这之后...但我可能误解了......
select a.*
from docs a
join (
SELECT id_obj
FROM docs
WHERE `id_sub` IN (1,2,7)
group
by id_obj
having count (distinct id_sub) = 3
) b
on b.id_obj = a.id _obj;