1

最初にテーブルデータを表示してから、問題について説明します。

MySQLテーブルの構造

CREATE TABLE more_tags (
tag_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
more_id INT UNSIGNED NOT NULL,
user_id INT UNSIGNED NOT NULL,
tag_name VARCHAR(255) NOT NULL,
PRIMARY KEY (tag_id),
UNIQUE KEY (more_id, user_id, tag_name)
);

CREATE TABLE tags(
tag_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
another_id INT UNSIGNED NOT NULL,
user_id INT UNSIGNED NOT NULL,
tag_name VARCHAR(255) NOT NULL,
PRIMARY KEY (tag_id),
UNIQUE KEY (another_id, user_id, tag_name)
);

more_tadsテーブルデータ

tag_id  tag_name
10      apple 
192     apple 
197     apple 
203     apple 
207     apple 
217     news 
190     bff
196     cape

タグテーブルデータ

tag_id  tag_name
1       apple 
2       time 
3       bff

さて、私は以前にいくつかの同様の質問をしました。しかし、何らかの理由で、両方のテーブルのタグをカウントするクエリを取得できません。次の例のように、1つのテーブルのタグのみをカウントします。

現在の出力

tag_id  tag_name    num
1       apple       5
2       bff         1
3       cape        1
4       time        1

しかし、私はすべての類似したタグをグループ化し、以下の例のようにテーブルで見つかった回数を数えたいと思います

必要な出力

tag_id  tag_name    num
1       apple       6
2       bff         2
3       cape        1
4       time        1

現在のMySQLクエリ

SELECT *
FROM(SELECT `more_tags`.`tag_id`, `more_tags`.`tag_name`, COUNT(`more_tags`.`tag_name`) as 'num' 
FROM `more_tags` 
INNER JOIN `users` ON `more_tags`.`user_id` = `users`.`user_id` 
WHERE `users`.`active` IS NULL 
AND `users`.`deletion` = '0' 
GROUP BY `more_tags`.`tag_name`
UNION(
SELECT `tags`.`tag_id`, `tags`.`tag_name`, COUNT(`tags`.`tag_name`) as 'num' 
FROM `tags` 
INNER JOIN `users` ON `tags`.`user_id` = `users`.`user_id` 
WHERE `users`.`active` IS NULL 
AND `users`.`deletion` = '0' 
GROUP BY `tags`.`tag_name`))
AS table_1 
GROUP BY `tag_name`  
ORDER BY `tag_name` ASC
4

2 に答える 2

0

これにより、必要な結果が出力されます。サブクエリにユーザーの参加を追加するだけです。

SELECT a.tag_id, a.tag_name, SUM(a.num)
FROM (
     SELECT tag_id, tag_name, SUM(1) as num  FROM tags
        GROUP BY tag_name
     UNION
     SELECT tag_id, tag_name, SUM(1) as num  FROM more_tags
        GROUP BY tag_name
      ) a
GROUP BY a.tag_name
于 2013-02-07T05:23:06.273 に答える
0

目的の出力の tag_id は、私には意味がありません。それがなければ、求めているものを取得する方法は次のとおりです。

SELECT tag_name, SUM(num)
FROM(SELECT `more_tags`.`tag_name`, COUNT(*) as 'num' 
FROM `more_tags` 
INNER JOIN `users` ON `more_tags`.`user_id` = `users`.`user_id` 
WHERE `users`.`active` IS NULL 
AND `users`.`deletion` = '0' 
GROUP BY `more_tags`.`tag_name`
UNION ALL
SELECT `tags`.`tag_name`, COUNT(*) as 'num' 
FROM `tags` 
INNER JOIN `users` ON `tags`.`user_id` = `users`.`user_id` 
WHERE `users`.`active` IS NULL 
AND `users`.`deletion` = '0' 
GROUP BY `tags`.`tag_name`)
AS table_1 
GROUP BY `tag_name`  
ORDER BY `tag_name` ASC

キーポイントを示すためにユーザーロジックを削除した SQL Fiddle: http://sqlfiddle.com/#!2/ea44d/2

また、質問に欠けている重要な部分であるUNION ALLSUMを忘れないでください。UNION ALL がないと、フィドルで示したような例にない場合、一部の行が重複として拒否される可能性があります。

于 2013-02-07T05:14:56.077 に答える