表结构和值如下:
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
的行,其中 all id_obj
具有相同的值,即我无法获得下一个结果:
id | id_sub | id_obj
1 | 1 | 1
4 | 1 | 10
11 | 2 | 10
12 | 2 | 1
17 | 7 | 1
18 | 7 | 10
表有大约 20k 行,IN()
的计数值可以不同。
有什么想法吗?
UPD - 描述条件
我知道条件 id_sub
的值 - 1,2 或 7(示例)
我不知道值 id_obj
预期结果的条件:
- 值
id_sub
1、2 或 7 - 行没有重复值
id_sub
&id_sub
,即id
= 1 和id
= 5 是重复的(查看值行)并且结果可以只有一行id
= 1(如果重复的行需要返回第一个重复行) id_obj
值应该在每行结果中,即: 现在结果我有:编号 | id_sub | id_obj
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
正如我们在这一行中看到的,只有 id
= 1 的行具有 id_obj
值,而在其他行中:
id | id_sub | id_obj
1 | 1 | 1
12 | 2 | 1
17 | 7 | 1
对于所有表格,我希望获得下一个结果:
最佳答案
我在这里找到了一个正在运行的查询。
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
但我不确定这是不是最好的解决方案。
我 guest 的子查询太多。但聊胜于无。
希望对您有所帮助。
关于mysql - 如何从表中为某些行选择具有相同值的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46986368/