에서 집계 나는 두 테이블 내가 인상의 합을 가지고 계산과 별개 device_ids 클릭 캠페인 및 광고주 수준에서 집계되는보고 싶은 MySQL의 쿼리 : 두 개의 서로 다른 수준의
mysql> select * from report;
+----+----------+------------+------------------+-------------+
| id | campaign | advertiser | impression_count | click_count |
+----+----------+------------+------------------+-------------+
| 1 | camp1 | adv1 | 20 | 6 |
| 2 | camp2 | adv2 | 10 | 2 |
| 3 | camp1 | adv1 | 15 | 3 |
| 4 | camp2 | adv2 | 6 | 1 |
+----+----------+------------+------------------+-------------+
4 rows in set (0.00 sec)
mysql> select * from device;
+-----------+-----------+
| report_id | device_id |
+-----------+-----------+
| 1 | d1 |
| 1 | d2 |
| 2 | d1 |
| 2 | d3 |
| 2 | d4 |
| 3 | d2 |
| 3 | d4 |
| 4 | d3 |
| 4 | d4 |
| 4 | d5 |
+-----------+-----------+
10 rows in set (0.00 sec)
있습니다. 그래서 아래 쿼리를 작성했습니다.
mysql> select campaign,advertiser,sum(impression_count),sum(click_count),count(distinct device_id) from report LEFT JOIN device ON report.id=device.report_id group by campaign,advertiser;
+----------+------------+-----------------------+------------------+---------------------------+
| campaign | advertiser | sum(impression_count) | sum(click_count) | count(distinct device_id) |
+----------+------------+-----------------------+------------------+---------------------------+
| camp1 | adv1 | 70 | 18 | 3 |
| camp2 | adv2 | 48 | 9 | 4 |
+----------+------------+-----------------------+------------------+---------------------------+
여기서는 조인 횟수와 click_count가 여러 행에 대해 집계 되었기 때문에 여기에 씁니다. 무엇 원하는 것은
+----------+------------+-----------------------+------------------+---------------------------+
| campaign | advertiser | sum(impression_count) | sum(click_count) | count(distinct device_id) |
+----------+------------+-----------------------+------------------+---------------------------+
| camp1 | adv1 | 35 | 9 | 3 |
| camp2 | adv2 | 16 | 3 | 4 |
+----------+------------+-----------------------+------------------+---------------------------+
http://sqlfiddle.com/#!2/05dd9d/1
이 너무 좋지 않다 솔루션을select campaign,advertiser,ic,cc,count(distinct device_id)
from (
select
group_concat(id) as id,
sum(impression_count)as ic,
sum(click_count)as cc,
campaign,advertiser
FROM report har GROUP BY campaign,advertiser) a
LEFT JOIN device dr ON FIND_IN_SET(dr.report_id, a.id)
group by a.id
);
발견하지만이 GROUP_CONCAT 결과의 아이폰에이 큰 경우 문제가 발생할 수 있으므로 그룹 CONCAT를 사용합니다.
[SQL 바이올린]에서 테이블 스키마를 업데이트하십시오 (http://sqlfiddle.com/) –