【问题标题】:Return zero when records not found未找到记录时返回零
【发布时间】:2012-05-20 15:29:12
【问题描述】:

我正在制作一个表格生成器作为一个学校项目。 在 MySQL 中,我有 3 个表,即进程、操作、分数。一切看起来都很好,直到我在网络应用程序中测试了我的“添加列”按钮。 以前保存的数据应该被正确读取但也包括格式中的新列,问题是以前查询的数据不包含新表的任何值,所以我打算如果没有找到记录它返回0分,试过了IFNULL & COALESCE 但什么也没发生(也许我只是用错了)

  • 进程 - 进程 ID、进程名称
  • 操作 - 操作 ID、操作名称
  • score - scoreID, score, processID, operationID, scoreType (score 类型是 SELF,GL,FINAL)

    ps = (PreparedStatement)dbconn.prepareStatement("SELECT score FROM score WHERE processID=? and operationID=? and type=?ORDER BY processid");

这是一个小样本的图片http://i50.tinypic.com/2yv3rf9.jpg

【问题讨论】:

    标签: mysql sql jsp servlets


    【解决方案1】:

    IFNULL 不起作用的原因是它只对值有影响。没有行的结果集没有值,所以它什么也不做。

    首先,在客户端执行此操作可能比在服务器上执行此操作更好。但是,如果您必须在服务器上执行此操作,我可以想到几种方法。

    试试这个:

    SELECT IFNULL(SUM(score), 0) AS score
    FROM score
    WHERE processID=? and operationID=? and type=?
    ORDER BY processid
    

    SUM 确保只返回一行。

    如果您需要在表包含多个匹配行时返回多行,那么您可以使用它(为简单起见省略 ORDER BY):

    SELECT score
    FROM score
    WHERE processID = ? and operationID = ? and type = ?
    
    UNION ALL
    
    SELECT 0
    FROM (SELECT 0) T1
    WHERE NOT EXISTS
    (
        SELECT *
        FROM score
        WHERE processID = ? and operationID = ? and type = ?
    )
    

    【讨论】:

    • 很好的答案.. 真的很感激。
    猜你喜欢
    • 2021-11-24
    • 1970-01-01
    • 2013-07-24
    • 2019-10-31
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多