【问题标题】:How to display the total count of the last row by filestatus?如何按文件状态显示最后一行的总数?
【发布时间】:2021-04-04 12:58:40
【问题描述】:

我必须按文件状态显示最后一行的总数。

tbl_bankdata

bank_id | b_orderno| b_bankname| lead_id
     1  | 01-01    | 1         |  1
     2  | 01-02    | 2         |  1
     3  | 02-01    | 3         |  2
     4  | 03-01    | 1         |  3

tbl_fileStatus

f_id | f_bankid| f_filestatus
  1  |      1  | 1
  2  |      2  | 1
  3  |      2  | 2
  4  |      1  | 2
  5  |      1  | 3
  6  |      3  | 2 
  7  |      3  | 3  

我有两张桌子tbl_bankdatatbl_fileStatus。我在tbl_fileStatus 中发送bank_id 作为f_bank_id

现在我必须显示最后一个 f_bankid 计数。

例如,我必须获取 f_filestatus=1 的计数。所以我的输出将是0。为什么0 因为f_bankid 1 and 2 有一个f_filestatus=1f_bankid 1 and 2 的最后一行带有f_filestatus 3 and 2

如果我必须计算f_filestatus=2,那么我将得到输出1,如果计算f_filestatus=3,那么输出将是2。为什么是 2,因为 f_bank_id 1f_filestatus 3f_bank_id 3f_filestatus 3

这是我的查询

select (
    SELECT COUNT(f_id) 
    FROM tbl_fileStatus 
    WHERE f_filestatus=1 and f_id IN (
        SELECT MAX(f_id) FROM tbl_fileStatus GROUP BY f_bankid
    )
) as tcount

你能帮我解决这个问题吗?

@forpas 建议后

SELECT (SELECT Count(DISTINCT f_bankid)
    FROM   tbl_filestatus t
    WHERE  1 = (SELECT f_filestatus
                FROM   tbl_filestatus
                WHERE  f_bankid = t.f_bankid
                ORDER  BY f_id DESC
                LIMIT  1)) AS tcount1,
   (SELECT Count(DISTINCT f_bankid)
    FROM   tbl_filestatus t
    WHERE  2 = (SELECT f_filestatus
                FROM   tbl_filestatus
                WHERE  f_bankid = t.f_bankid
                ORDER  BY f_id DESC
                LIMIT  1)) AS tcount2,
   (SELECT Count(DISTINCT f_bankid)
    FROM   tbl_filestatus t
    WHERE  3 = (SELECT f_filestatus
                FROM   tbl_filestatus
                WHERE  f_bankid = t.f_bankid
                ORDER  BY f_id DESC
                LIMIT  1)) AS tcount3  

【问题讨论】:

  • 你期望什么输出?您的查询有什么问题?
  • @JeffUK,f_filestatus=1 然后 cout 0,f_filestatus=2 计数 1 f_filestatus=3 然后计数 2
  • 你有什么 MySQL 版本?从 MySQL 8 开始你可以使用窗口函数来解决这个问题
  • @SlavaRozhnev,PHPmyadmin 5.0.4 已安装
  • @user9437856 最后一行的计数将始终为 1...您能否在您的问题中添加一个示例预期结果集?

标签: mysql sql subquery left-join greatest-n-per-group


【解决方案1】:

您可以使用下一个查询,但有一个例外 - 查询不返回 0 结果,但可以在可视化级别解决:

SELECT COUNT(*) FROM tbl_fileStatus 
JOIN (
    SELECT f_bankid, MAX(f_filestatus) AS max_f_filestatus
    FROM tbl_fileStatus GROUP BY f_bankid
) AS m ON m.max_f_filestatus = tbl_fileStatus.f_filestatus and
  m.f_bankid = tbl_fileStatus.f_bankid
  WHERE tbl_fileStatus.f_filestatus = 3 -- or 2 or any other value :)

Test SQL here

【讨论】:

    【解决方案2】:

    使用相关子查询:

    SELECT COUNT(DISTINCT f_bankid) AS tcount
    FROM tbl_fileStatus t
    WHERE ? = (SELECT f_filestatus FROM tbl_fileStatus WHERE f_bankid = t.f_bankid ORDER BY f_id DESC LIMIT 1)
    

    ? 替换为您搜索的f_bankid
    请参阅demo

    在MySql 8.0+中可以使用FIRST_VALUE()窗口函数:

    SELECT COUNT(*) AS tcount
    FROM (
      SELECT DISTINCT f_bankid, 
             FIRST_VALUE(f_filestatus) OVER (PARTITION BY f_bankid ORDER BY f_id DESC) f_filestatus
      FROM tbl_fileStatus
    ) t
    WHERE f_filestatus = ?
    

    请参阅demo

    如果您想要 1 行中所有 f_filestatus 的结果:

    SELECT
      SUM(f_filestatus = 1) AS tcount1,
      SUM(f_filestatus = 2) AS tcount2,
      SUM(f_filestatus = 3) AS tcount3
    FROM (
      SELECT t.f_bankid, t.f_filestatus
      FROM tbl_fileStatus t
      WHERE t.f_id = (SELECT f_id FROM tbl_fileStatus WHERE f_bankid = t.f_bankid ORDER BY f_id DESC LIMIT 1)
    ) t
    

    请参阅demo
    结果:

    > tcount1 | tcount2 | tcount3
    > ------: | ------: | ------:
    >       0 |       1 |       2
    

    【讨论】:

    • 我在哪里买不到这个?
    • @user9437856 替换?有 1 或 2 或 3。检查我的答案中的演示。
    • 我必须为每个 f_filestatus 设置别名,因为我必须在仪表板上显示它。就像在我的问题中一样,我将 f_filestatus=1 设置为 tcount
    • @user9437856 只需添加AS tcount。请参阅我编辑的答案。
    • 给我一些时间在我的代码中实现
    【解决方案3】:

    在 MySQL 8.0 中,我会推荐row_number()

    select count(*) as cnt
    from (
        select fs.*,
            row_number() over(partition by f_bank_id order by f_id desc) rn
        from tbl_filestatus fs
    ) fs
    where rn = 1 and filestatus = ?
    

    适用于所有版本的替代方法是相关子查询:

    select count(*) as cnt
    from tbl_filestatus fs
    where fs.f_id = (
        select max(fs1.f_id)
        from tbl_filestatus fs1
        where fs1.f_bank_id = fs.bank_id and fs1.filestatus = ?
    )
    

    为了提高第二个查询的性能,请考虑在(bank_id, filestatus, fs_id desc) 上创建一个索引。使用此索引,该查询可能比使用row_number() 的第一种方法运行得更快,即使在 MySQL 8.0 中也是如此。

    如果您想一次计算所有filestatuses:

    select filestatus, count(*) as cnt
    from tbl_filestatus fs
    where fs.f_id = (
        select max(fs1.f_id)
        from tbl_filestatus fs1
        where fs1.f_bank_id = fs.bank_id
    )
    group by filestatus
    

    【讨论】:

      猜你喜欢
      • 2014-11-01
      • 1970-01-01
      • 2016-10-02
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 2021-10-06
      相关资源
      最近更新 更多