2013-02-07 195 views
1

首先讓我顯示我的表格數據,然後我會解釋我的問題。MySQL聯盟計數

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 

好的,我早些時候問過一些類似的問題。但是,現在由於某種原因,我不能得到查詢計數兩個表的標籤,只計算從一個表的標籤,如下面

的例子

電流輸出繼電器

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 
+0

你可以嘗試刪除第二個括號的(())嗎? –

+0

@Bhavik Shah,還沒有試圖找到解決方案。 –

回答

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撥弄去除展示的重點用戶邏輯:http://sqlfiddle.com/#!2/ea44d/2

而且不要忘了UNION ALL SUM 哪些是你的問題中缺少的關鍵部分。如果沒有UNION ALL,當它們不在像我在小提琴中給出的例子那樣的示例中時,可以將一些行拒絕爲重複項。

0

考慮到你指望工會的兩個部分,你可以總結這兩個。你通過tag_name進行分組,你已經做了。

SELECT *, SUM('num') as 'big_num' 
FROM(
SELECT `more_tags`.`tag_id`, `more_tags`.`tag_name`, COUNT(`more_tags`.`tag_name`) as 'num' 
...same... 
GROUP BY `more_tags`.`tag_name` 
UNION(
SELECT `tags`.`tag_id`, `tags`.`tag_name`, COUNT(`tags`.`tag_name`) as 'num' 
...same... 
GROUP BY `tags`.`tag_name` 
)# UNION 2nd Part 
)# UNION table 
AS table_1 
GROUP BY `tag_name` # you were doing this already 
ORDER BY `tag_name` ASC 
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