如何从表中为某些行选择具有相同值的行?

时间:2017-10-28 04:51:12

标签: mysql

表格结构和价值如下:

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

预期结果的条件:

  1. id_obj 1,2或7
  2. 行没有公布的值id_sub& id_sub,即id_sub = 1且id = 5的行是dublicate(请参阅值行),结果可以只有一行id = 1(如果行重复需要返回第一个重复行)
  3. id值应该在每行结果中,即: 现在结果我有:

    id | id_sub | id_obj

    1 | 1 | 1

    2 | 1 | 2

    3 | 1 | 3

  4. 正如我们在此行中看到的那样,只有id_obj = 1的行具有id值,其中包含其他行:

    id_obj

    对于所有表格,我想获得下一个结果:

    enter image description here

    Sql fiddle table with rows

3 个答案:

答案 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;