【问题标题】:Multiple inner join on a table where rows represent data attributes表上的多个内部联接,其中行表示数据属性
【发布时间】:2014-06-27 10:45:51
【问题描述】:

我有以下用户表(不要问我为什么:))

| id | cid | attr | text |   rdate    |
---------------------------------------
|  1 |  1  | name |  joe |    NULL    |
|  2 |  1  | date | NULL | 10.05.2014 |
|  3 |  1  | stat |   2  |    NULL    |
----------------------------------------
|  4 |  2  | name |  joe |    NULL    |
|  5 |  2  | date | NULL | 05.05.2014 |
|  6 |  2  | stat |   1  |    NULL    |
----------------------------------------
|  7 |  3  | name |  joe |    NULL    |
|  8 |  3  | date | NULL | 03.05.2014 |
|  9 |  3  | stat |   2  |    NULL    |

如您所见,每个用户的属性(姓名、日期、统计信息)都是表中的一行。 同一个cid的属性属于同一个用户。

我想删除所有引用属性日期在 08.05.2014 之前且属性 stat 不是 2 的用户的所有条目。因此,运行此查询后,表将是:

| id | cid | attr | text |   rdate    |
---------------------------------------
|  1 |  1  | name |  joe |    NULL    |
|  2 |  1  | date | NULL | 10.05.2014 |
|  3 |  1  | stat |   2  |    NULL    |
----------------------------------------
|  7 |  3  | name |  joe |    NULL    |
|  8 |  3  | date |  joe | 03.05.2014 |
|  9 |  3  | stat |   2  |    NULL    |

有可能吗?这是同一张表的内连接吗?

【问题讨论】:

  • 哇,好多好答案!对所有人 +1,即使他们重复。

标签: mysql inner-join


【解决方案1】:

cid 分组并使用having 子句运行组函数以检查每个组中的要求

delete from your_table
where cid in
(
  select * from 
  (
    select cid
    from your_table
    group by cid
    having sum(attr = 'date' and `date` < '2014-05-08') > 0
    and sum(attr = 'stat' and `text` = 2) = 0
  ) tmp_tbl
)

在 MySQL 中,您不能从您选择的同一个表中删除。但是你可以用上面例子中的另一个子查询来欺骗 MySQL。

【讨论】:

  • 您忘记了stat 属性。
  • 非常感谢您的回复,从未听说过“拥有”!只是一个问题,您使用“日期”和“统计”作为字段,但它们只是 attr 的值,不是吗?
【解决方案2】:

你可以用delete/join来做到这一点:

delete t
    from table t join
         (select cid
          from table t
          group by cid
          having max(case when attr = 'date' and date < '2014-05-08') > 0 and
                 max(case when attr = 'stat' and text <> '2') > 0
         ) s
         on t.cid = s.cid;

【讨论】:

    【解决方案3】:

    我会在 delete 语句中做一个相当简单的 JOIN:-

    DELETE a
    FROM some_table a
    INNER JOIN some_table b
    ON a.cid = b.cid
    INNER JOIN some_table c
    ON a.cid = c.cid
    WHERE b.attr = 'date' AND b.date < '2014-05-08'
    AND c.attr = 'stat' AND c.text != '2'
    

    【讨论】:

      【解决方案4】:

      加入即可:

      Delete from mytable where cid in (select cid from
          (select t1.cid FROM mytable t1 INNER JOIN mytable t2 ON t1.cid = t2.cid
               WHERE t1.attr = 'date' AND t1.rdate < '2014-05-08' 
                      AND t2.attr = 'stat' AND t2.text != 2) as sq)
      

      【讨论】:

        猜你喜欢
        • 2017-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2013-10-22
        • 2016-07-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多