【问题标题】:How select rows with same values from table for some rows?如何从表中为某些行选择具有相同值的行?
【发布时间】:2018-04-09 17:28:05
【问题描述】:

表结构和值如下:

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 的行,其中 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

预期结果的条件:

  1. id_sub 1、2 或 7
  2. 行没有重复值id_sub&id_sub,即id = 1 和id = 5 的行是重复的(见值行),结果只能有一行id = 1(如果重复行需要返回第一个重复行)
  3. 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

对于所有表格,我希望得到下一个结果:

Sql fiddle table with rows

【问题讨论】:

  • 您的预期结果是什么?
  • 我不明白这个问题
  • 我也不明白这个问题。
  • 您似乎正在尝试获取每个不同 id_sub 块 id_obj 的第一个 id。但是我不明白为什么 3,1,3 不在结果集中。
  • 其中 id_sub, id_obj count > 1

标签: mysql


【解决方案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

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

【讨论】:

  • 我编辑结果(坏版本),你能再看看吗?我删除重复的行
  • 是的,它有效,谢谢。 但我不确定这是不是最好的解决方案。 - 也许,但现在它只是决定......
【解决方案2】:

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

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)

【讨论】:

  • 结果不应包含 id=3 的行
  • 为什么不应该呢?数据中有 2 次出现 1,3。
  • 因为id_sub =2id_sub =7 没有id_obj=3。请参阅有问题的image with expected results
  • 那么为什么id_obj = 10出现10没有出现在id sub = 4,5,6中?
【解决方案3】:

我想你只是在追求这个……但我可能误解了……

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;

【讨论】:

  • 我有错误 查询错误:错误:ER_PARSE_ERROR:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在第 5 行的“_obj”附近使用的正确语法。请检查您的查询here
猜你喜欢
  • 2016-11-05
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多