【问题标题】:Reading evaluated data from MySQL database从 MySQL 数据库中读取评估数据
【发布时间】:2012-02-19 18:54:25
【问题描述】:

我有一个包含以下列的 MySQL 数据库表

ID
status (can contain values 0, 1, 2)
timepstamp
text
note
owner

我想从表中获取有关特定所有者条目的以下信息:

 number of entries
 number of entries where status=0
 number of entries where status=1
 number of entries where status=2
 number of entries where LENGTH(note)>0
 minimum timestamp
 maximum timestamp

我曾经阅读完整的数据集,然后使用 PHP 评估它们

SELECT status, timestamp, LENGTH(note)>0 WHERE owner="name";

我的问题是某些用户的条目太多,如果我将数据读取到 PHP,我经常会遇到内存不足的错误。我认为让 MySQL 评估数据应该更好。我无法编写可以完成此任务的查询。

SELECT
    MIN(timestamp) AS mintime,
    MAX(timestamp) AS maxtime,
    COUNT(*) AS number,
    ...
WHERE owner="name"

是否有可能一次性获得结果?例如,在 COUNT 内使用嵌套的 WHERE 或 IF?

    COUNT(WHERE status=0) AS inactive
    COUNT(IF(status=1)) AS active
    ...

你会如何解决这个问题?

【问题讨论】:

    标签: mysql select count


    【解决方案1】:

    试试看 -

    SELECT
        COUNT(*) AS total,
        SUM(IF(status=0, 1, 0)) AS stat0,
        SUM(IF(status=1, 1, 0)) AS stat1,
        SUM(IF(status=2, 1, 0)) AS stat2,
        SUM(IF(LENGTH(note)>0, 1, 0)) AS notes,
        MIN(timestamp) AS mintime, 
        MAX(timestamp) AS maxtime
    FROM tbl_name
    WHERE owner="name"
    GROUP BY owner
    

    【讨论】:

    • 工作正常。我唯一需要改变的是状态的值,因为我使用的是 ENUM。似乎 MySQL 正在使用键进行比较(值“0”的键是“1”,...)
    【解决方案2】:

    试试这个:

    SELECT
    MIN(`timestamp`) AS `mintime`,
    MAX(`timestamp`) AS `maxtime`,
    COUNT(`ID`) AS `number`,
    (SELECT COUNT(`ID`) FROM `Table` WHERE `owner` = 'owner' AND `status` = 0) AS `inactive`,
    (SELECT COUNT(`ID`) FROM `Table` WHERE `owner` = 'owner' AND `status` = 1) AS `active`,
    (SELECT COUNT(`ID`) FROM `Table` WHERE `owner` = 'owner' AND LENGTH(`note`)>0) AS `longentries`
    FROM `Table`
    WHERE `owner` = 'name'
    

    不过,您可能应该考虑规范化数据库设计,这样您就有两个单独的表,一个用于用户,一个用于条目,如下所示:

    用户 ID 姓名 状态

    条目 ID 用户身份 时间戳 文本 注意(如果这是一个特定于条目的字段;否则将其移动到表 USERS)

    希望这会有所帮助。

    【讨论】:

    • 您关于规范化设计的观点是正确的,但是使用子查询来获取这些统计数据是非常低效的,因为它可以在没有多次读取的情况下轻松完成。
    • 我没有看到任何不规范的东西。 status 很可能是行的状态,无论存储的是什么(文本、注释),而不是所有者的状态。
    • 公平点,两者都 - 谢谢!我什至不知道你可以使用你在答案中使用的语法,nnichols。生活和学习 :) 给了你一个 +1!
    猜你喜欢
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多