3

次の2つのテーブルがあります:

テーブルクエリとテーブル時間:

id | text     id | mid | country
1    hello     1    1       UK
2     hi       2    1       PL
3     sd       3    2       USA

id = mid、国は異なります (英国、米国など)。

次のリストを作成する必要があります。

UK - text 30 rows (this text has most mid in table 2 for UK)
USA - text 25 rows
PL - text 10 rows
...
SS - text 1 rows.

今のところ、次のアイデアがあります。各国のどの MID が最大行を持っているかを取得し、mid=id でテキストを取得して並べ替えます。

SELECT time.country,querys.text,COUNT(mid) AS cnt 
     FROM time INNER JOIN `querys` ON(time.mid = querys.id) 
      GROUP BY mid 
      ORDER BY country,cnt
      DESC

しかし、このコードでは、すべてのテキストをカウントとともに受け取ります。そのような

UK text1 30, 
UK text2 25, 
PL text2 10, 
PL text3 5 ..

しかし、国ごとに最大値が 1 つだけ必要です。クエリを国ごとに最大 1 つのテキストにカットする方法を教えてください。

4

1 に答える 1

2
SELECT  a.country, 
        b.text, 
        COUNT(*) AS cnt 
FROM    time a
        INNER JOIN querys b
            ON a.mid = b.id
        INNER JOIN
        (
            SELECT  Country, 
                    MAX(totalCount) max_count
            FROM
                    (
                        SELECT  Country, Mid, 
                        COUNT(*) totalCount
                        FROM    time
                        GROUP   BY Country, Mid
                    ) s
            GROUP   BY Country
        ) c ON a.country = c.country
GROUP   BY a.country, b.text, c.max_count
HAVING  COUNT(*) = c.max_count
ORDER   BY cnt DESC

出力

╔═════════╦══════╦═════╗
║ COUNTRY ║ TEXT ║ CNT ║
╠═════════╬══════╬═════╣
║ UA      ║ sdf  ║  10 ║
║ USA     ║ qw   ║   2 ║
╚═════════╩══════╩═════╝
于 2013-05-11T15:33:04.640 に答える