繁体   English   中英

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

[英]How select rows with same values from table for some rows?

表结构和值如下:

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_subid_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都具有相同的值,即无法获得下一个结果:

   id  |  id_sub  |  id_obj
   1   |    1     |  1
   4   |    1     |  10
   11  |    2     |  10
   12  |    2     |  1
   17  |    7     |  1
   18  |    7     |  10

表有约2万行, IN()计数值可以不同。

有任何想法吗?


UPD-说明条件

我知道条件id_sub值-1,2或7(示例)

我不知道值id_obj

预期结果的条件:

  1. id_sub 1、2或7
  2. 行没有重复的值id_subid_sub ,即id = 1和id = 5的行是重复的(请参阅值行),结果只能是id = 1的一行(如果重复的行需要返回第一重复行)
  3. id_obj值应该在每一行结果中,即:现在结果中我具有:

    id | 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

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

在此处输入图片说明

SQL小提琴表与行

我在这里找到一个正在运行的查询。

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

但是我不确定这是最好的解决方案。
我来宾的子查询太多。 但总比没有好。
希望能有所帮助。

为了获得结果,我认为您希望您的源数据必须是

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)

我想您只是在此之后...但是我可能误会了...

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM