2013-02-07 3 views
1

먼저 테이블 데이터를 보여 주면 내 문제를 설명 할 것입니다.MySQL UNION COUNT

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 

좋아, 나는 어떤 비슷한 질문을 먼저 물었다. 하지만 지금은 어떤 이유로 나는 그러나 내가 원하는

현재 OUPUT에게 쿼리에만

아래 예 같이 한 테이블 태그 카운트 양쪽 테이블 태그를 카운트

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 

원하는 출력의 tag_id 정말 이해가되지 않습니다

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

현재 MySQL의 쿼리합니다.

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 바이올린을 핵심 보여 제거 사용자 로직과 : 노동 조합에게 ALLSUM 잊지 마세요 또한 http://sqlfiddle.com/#!2/ea44d/2

을 여기에 당신이 요구하는 것을 얻을 어떻게없이 질문에 누락 된 핵심 부분 인. 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

이렇게하면 원하는 결과가 출력됩니다. Sub 쿼리에 사용자 조인을 추가하기 만하면됩니다.

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