2014-09-04 93 views
0

我需要幫助獲取來自mysql數據庫中兩個不同表的列的前5個結果和它們的計數。已加入並計數的mysql查詢

table1 cols 
------- 
id, country, timestamp 

table2 cols 
-------- 
id, table1_id, reason 

結果ID喜歡得到的是前5名的國家和他們的兩個時間戳之間發現的次數,和前5位的原因和他們的計數用於生成第一計數所有行。 table1和table2之間有一對多關係。這是困擾我,我感謝你可以給我的任何見解。

回答

0

這並不完全清楚你想要返回的結果集。

這可能是對你有所幫助:

SELECT t.country 
    , COUNT(DISTINCT t.id) AS count_table1_rows 
    , COUNT(r.id)   AS count_table2_rows 
    , COUNT(*)    AS count_total_rows 
    FROM table1 t 
    LEFT 
    JOIN table2 r 
    ON r.table1_id = t.id 
WHERE t.timestamp >= NOW() - INTERVAL 7 DAY 
    AND t.timestamp < NOW() 
GROUP BY t.country 
ORDER BY COUNT(DISTINCT t.id) DESC 
LIMIT 5 

,一個最大的5行,每國一行將返回,並在表1的行數,在表2中的行數,和返回的總行數。

LEFT關鍵字指定「外部」連接操作,即使table2中找不到匹配行,也會返回table1中的行。

要獲得與每個國家相關的計數每一個「理由」,你可以做這樣的事情:

SELECT t.country 
    , COUNT(DISTINCT t.id) AS count_table1_rows 
    FROM table1 t 
    LEFT 
    JOIN (SELECT s.country 
       , r.reason 
       , COUNT(*) AS cnt_r 
      FROM table1 s 
      JOIN table2 r 
      ON s.table1_id = t.id 
      WHERE s.timestamp >= NOW() - INTERVAL 7 DAY 
      AND s.timestamp < NOW() 
      GROUP 
      BY s.country 
       , r.reason 
     ) u 
    ON u.country = t.country 
WHERE t.timestamp >= NOW() - INTERVAL 7 DAY 
    AND t.timestamp < NOW() 
GROUP 
    BY t.country 
    , u.reason 
ORDER 
    BY COUNT(DISTINCT t.id) DESC 
    , t.country DESC 
    , u.cnt_r DESC 
    , u.reason DESC 

此查詢不返回「限制」的行。可以將查詢修改爲僅返回一部分行,但可能會變得複雜。在我們挖掘添加「前五名」類型限制的複雜性之前,我們希望確保查詢返回的行是我們實際需要的行的超集。

0

這是你想要的嗎?

select t2.reason, count(*) 
from (select t1.country, count(*) 
     from table1 t1 
     where timestamp between @STARTTIME and @ENDTIME 
     group by country 
     order by count(*) desc 
     limit 5 
    ) c5 join 
    table1 t1 
    on c5.country = t1.country and 
     t1.timestamp between @STARTTIME and @ENDTIME join 
    table2 t2 
    on t2.table1_id = t1.id 
group by t2.reason; 

c5子查詢得到五個國家。另外兩個帶回最終聚合的數據。