【问题标题】:How to query a proper subset using MySQL?如何使用 MySQL 查询适当的子集?
【发布时间】:2017-03-21 13:22:24
【问题描述】:

我将举一个简单的例子来说明我的意思,但基本上我想选择表中的所有条目,这些条目是该表的某些其他条目的正确子集。例如,这是一个表格

+----+---------------+------------+
| id | name          |department  |
+----+---------------+------------+
|  1 | John Smith    |          1 |
|  1 | John Smith    |          2 |
|  2 | Sally Thomas  |          3 |
|  2 | Sally Thomas  |          4 |
|  3 | Jimmy John    |          1 |
|  3 | Jimmy John    |          2 |
|  3 | Jimmy John    |          3 |
|  4 | Tom Roberts   |          3 |
|  4 | Tom Roberts   |          4 |
+----+---------------+------------+

从该表中,我只想选择 John Smith。原因是 John Smith 工作的部门完全包含在 Jimmy John 工作的部门中。 Sally Thomas 工作的部门与 Tom Roberts 工作的部门相同,因此它们互不包含。我正在使用this 正确子集的定义。我怎么能写一个 SQL 语句来覆盖这个?谢谢!

【问题讨论】:

    标签: mysql sql database subset


    【解决方案1】:

    嗯嗯。 . .这似乎是一种自联接,但计数可能非常有用:

    select t1.name, t2.name
    from t t1 join
         t t2
         on t1.department = t2.department join
         (select name, count(*) as cnt
          from t
          group by name
         ) t1name
         on t1.name = t1name.name join
         (select name, count(*) as cnt
          from t
          group by name
         ) t2name
         on t2.name = t2name.name
    group by t1.name, t2.name
    having count(*) = t2name.cnt and  -- have everything in t2
           t2name.cnt < t1name.cnt;   -- strict subset
    

    嗯,另一种方法使用group_concat()

    select t1.name, t2.name
    from t t1 join
         t t2
         on t1.department = t2.department
    group by t1.name, t2.name
    having group_concat(t2.department order by t2.department) =
               (select group_concat(t.department order by t.department)
                from t
                where t.name = t2.department
               );
    

    【讨论】:

      【解决方案2】:
      SELECT a.name
      FROM (
          SELECT id,name,group_concat(dept) AS dept
          FROM tab
          GROUP BY id
      ) AS a
      JOIN (
          SELECT id,name,group_concat(dept) AS dept
          FROM tab
          GROUP BY id
      ) AS b ON b.dept LIKE concat(a.dept,',%')
      

      【讨论】:

        猜你喜欢
        • 2013-11-26
        • 2012-04-16
        • 1970-01-01
        • 2020-01-11
        • 2017-06-04
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        相关资源
        最近更新 更多