0

見られる古い質問

テーブルスキーマ

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いずれかのテーブルに入力された特定の(またはユーザー)によるエントリの総数のカウントを取得したいと思います。

のエントリの1つが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
    

2番目の試行は、いくつかの関連する出力を生成することですnickが、両方のテーブルに表示されるすべての2つのエントリが含まれています。

また、最初のクエリで挿入されたエントリ/マグネットを2回カウントしたくありません。これが2番目のUNIONステートメントが行っていることです。両方のテーブルからすべての値を取り込みます。

SQLフィドルリンク

これは、ランダムに入力されたエントリとともにSQLFiddleへのリンクです

誰かが私をこれを通して案内してくれることを本当に望んでいます。それが助けになるなら、私はデータの最終的な表示にPHPを使用します。したがって、私の最後の手段は、カウントのためにPHPでループをネストすることです(これは現在行っています)。

必要な出力

フィドルで生成される出力は次のようになります。

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

1 に答える 1

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
于 2013-02-09T09:47:50.850 に答える