【问题标题】:Counting records in normalized table计算规范化表中的记录
【发布时间】:2013-02-09 09:12:10
【问题描述】:

看到较早的问题

表架构

entries包含来自2005-01-25的数据

CREATE TABLE `entries` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `ctg` VARCHAR(15) NOT NULL,
    `msg` VARCHAR(200) NOT NULL,
    `nick` VARCHAR(30) NOT NULL,
    `date` DATETIME NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `msg` (`msg`),
    INDEX `date` (`date`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

子表 magnets 带有来自2011-11-08常规数据(之前可能有一些条目)

CREATE TABLE `magnets` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `eid` INT(10) UNSIGNED NOT NULL,
    `tth` CHAR(39) NOT NULL,
    `size` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0',
    `nick` VARCHAR(30) NOT NULL DEFAULT 'hjpotter92',
    `date` DATETIME NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `eid_tth` (`eid`, `tth`),
    INDEX `entriedID` (`eid`),
    INDEX `tth_size` (`tth`, `size`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

问题

我想获取在任一表中输入的任何特定nick(或用户)的条目总数。

entries 中的一个条目与 magnets 同时填充,magnets 的后续条目可以来自相同的 nick 或不同。

我的代码

  • 试试 1

    SELECT `e`.id, COUNT(1), `e`.nick, `m`.nick
    FROM `entries` `e`
    INNER JOIN `magnets` `m`
        ON `m`.`eid` = `e`.id
    GROUP BY `e`.nick
    
  • 试试 2

    SELECT `e`.id, COUNT(1), `e`.nick
    FROM `entries` `e`
    GROUP BY `e`.nick
    UNION ALL
    SELECT `m`.eid, COUNT(1), `m`.nick
    FROM `magnets` `m`
    GROUP BY `m`.nick
    

第二次尝试生成一些相关的输出,但它包含两个表中出现的所有nick 的双重条目。

另外,我不想计算两次,即在第一个查询中插入的那些条目/磁铁。这就是第二个UNION 语句正在做的事情。它接受两个表中的所有值。

SQL 小提琴链接

Here 是指向 SQL Fiddle 的链接以及随机填充的条目。

我真的希望有人能指导我完成这个。如果有任何帮助,我将使用 PHP 来最终显示数据。所以,我最后的办法是在 PHP 中嵌套循环以进行计数(我目前正在这样做)。

期望的输出

应该在小提琴上生成的输出应该是:

************************************************
**        Nick        |||        Count        **
************************************************
**        Nick1       |||         10          **
**        Nick2       |||          9          **
**        Nick3       |||          6          **
**        Nick4       |||         10          **
************************************************

【问题讨论】:

    标签: mysql count normalize


    【解决方案1】:

    可能有一种更有效的方法,但如果我理解正确的话,这可行:

    SELECT SUM(cnt), nick FROM
    (SELECT count(*) cnt, e.nick FROM entries e 
      LEFT JOIN magnets m ON (e.id=m.eid AND e.nick=m.nick) 
      WHERE eid IS NULL GROUP BY e.nick
    UNION ALL
      SELECT count(*) cnt, nick FROM magnets m GROUP BY nick) u 
    GROUP BY nick
    

    【讨论】:

    • 进行了一次更新。它需要是UNION ALL,而不是UNION,才能更普遍正确。
    猜你喜欢
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 2011-04-18
    相关资源
    最近更新 更多