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

标签 mysql

表结构和值如下:

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

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

enter image description here

Sql fiddle table with rows

最佳答案

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

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/

相关文章:

java - 分割一个sql结果集,然后使用数组的每一部分进行查询

php - 我需要关闭 prestashop 中的数据库 session 吗

mysql - 多分组SQL,点击和用户计数错误

PHP 和 MySQL - Select 语句未返回正确的顺序

python - 使用Boto3与RDS上的亚马逊极光交互

创建存储过程时 MySQL 错误 #1064

java - Openshift 在 JBoss AS7 上部署失败,MYSQL 依赖错误

php - Laravel 关系数据库连接

mysql_install_db,Mac OS X 10.9.1 上的错误 : 35,

mysql - 如何从 GCP 上的实例备份恢复单个数据库?