【问题标题】:MySQL generate real-time counter grouped by parent IDMySQL 生成按父 ID 分组的实时计数器
【发布时间】:2011-03-10 22:41:06
【问题描述】:

我有两张桌子:

父母信息和依赖信息

表结构如下:

家长

ID   |   First   |   Last   |   DOB       |   Address
-------------------------------------------------
1    |   John    |   Doe    | 1980-01-01  |   123 street
2    |   Ryan    |   Mack   | 1974-12-12  |   444 Place

家属

ParentID   |    Type   |    First   |   Last    |    DOB
--------------------------------------------------
1    |   Spouse  |    Jane    |    Doe    |   1981-02-01
1    |   Child   |    Mike    |    Doe    |   1999-08-01
1    |   Child   |    Zoe     |    Doe    |   2002-04-01
2    |   Spouse  |    Sarah   |    Mack   |   1964-01-01
2    |   Child   |    Andrew  |    Mack   |   1997-05-01

我想构建一个查询(理想情况下,带有连接的单个调用会返回以下内容:

表格结果

First   |    Last    |    Type    |    DOB        |     Address
---------------------------------------------------------------- 
John    |    Doe     |    Parent  |  1980-01-01   |   123 Street
Jane    |    Doe     |    Spouse  |  1981-02-01   |   123 Street
Mike    |    Doe     |   Child    |  1999-08-01   |   123 street
Zoe     |    Doe     |   Child    |  2002-04-01   |   123 Street
Ryan    |    Mack    |  Parent    |  1974-12-12   |   444 Place
Sarah   |    Mack    |   Spouse   |  1964-01-01   |   444 Place
Andrew  |    Mack    |   Child    |  1997-05-01   |   444 Place

我可以在另一个 SO 用户的帮助下使用以下查询构建上面的表格:

SELECT t.First, t.Last, t.Type, t.DOB, t.Address
FROM (SELECT ID, First, Last, 'Parent' as Type, DOB, Address, 1 as SortKey
                 FROM Parent
            UNION ALL
            SELECT p.ID, d.First, d.Last, d.Type, d.DOB, p.Address, 
                         CASE WHEN d.Type = 'Spouse' THEN 2 ELSE 3 END as SortKey
                    FROM Dependents d
                            INNER JOIN Parent p
                                    ON d.ParentID = p.ID) t
ORDER BY t.ID, t.SortKey

我正在尝试解决一个(可能)更大的问题,因为我必须根据几个参数计算特定成员 ID 的每条记录。

父母永远是1, 配偶将始终为 2(如果存在) 孩子将从 3 岁开始,一直持续到不再有(如果有的话)。

我的茶几看起来像:

First   |    Last    |    Type    |    DOB        |     Address  |   Count
---------------------------------------------------------------------------
John    |    Doe     |    Parent  |  1980-01-01   |   123 Street |  1
Jane    |    Doe     |    Spouse  |  1981-02-01   |   123 Street |  2
Mike    |    Doe     |   Child    |  1999-08-01   |   123 street |  3
Zoe     |    Doe     |   Child    |  2002-04-01   |   123 Street |  4
Ryan    |    Mack    |  Parent    |  1974-12-12   |   444 Place  |  1
Sarah   |    Mack    |   Spouse   |  1964-01-01   |   444 Place  |  2
Andrew  |    Mack    |   Child    |  1997-05-01   |   444 Place  |  3

我知道我可以在调用的顶部设置一个用户变量说:

SET @counter:= 0;

那么 @counter:=@counter+1 作为计数器,

但这只会在整个 sql 查询中继续计数,而不是按 ID。

有什么想法吗?

【问题讨论】:

    标签: mysql subquery counter


    【解决方案1】:

    你们很亲密。

    SET @counter:= 0;
    @counter:=@counter+1 as counter;
    

    几乎可以做到你想要的,所以为什么不把它改成:

    SET @counter:= 3;
    SELECT
      inner_select.first
      ,inner_select.last
      ,inner_select.Type
      ,inner_select.DOB
      ,inner_select.Address
      ,CASE WHEN inner_select.SortKey IN (1,2) 
        THEN if(@counter:= 3 = 3,inner_select.SortKey,inner_select.SortKey)
       ELSE @counter:= @counter + 1 END as SortKey
    FROM
    (
      SELECT t.First, t.Last, t.Type, t.DOB, t.Address  
      FROM (SELECT ID, First, Last, 'Parent' as Type, DOB, Address, 1 as SortKey 
            FROM Parent
      UNION ALL
      SELECT p.ID, d.First, d.Last, d.Type, d.DOB, p.Address, 
        CASE WHEN d.Type = 'Spouse' THEN 2 ELSE 3 END as SortKey
      FROM Dependents d
      INNER JOIN Parent p ON d.ParentID = p.ID) t
      ORDER BY t.ID, t.SortKey 
    ) inner_select
    ORDER BY inner_select.ID, inner_select.SortKey;
    

    首先我们从 3 上的 @counter 开始,开始数孩子。
    因为之前的选择非常接近,我们选择 from 并稍微调整结果。
    if (@count:= 3 = 3,i.sk,i.sk) 当然总是给出inner_select.sortKey (不是@counter),但会强制重置@counter。

    希望这会有所帮助。

    【讨论】:

    • 似乎合乎逻辑 - 我将不得不尝试一下,尽管在一个调用中的 4 个子查询最终对我们来说可能不是很有效(考虑到有多少行和附加表受到影响)。我想尽可能多地在 mysql 中运行这些,但似乎可能构建一个基本的 php 脚本来处理 2 个调用(填充父级,然后填充他的家属)最终可能是正确的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多