Mysql 简单地数一对多

Mysql 简单地数一对多,mysql,Mysql,我正在统计数据库中每个国家的点击率, 其中包含以下表格: mysql> use DB; show tables; +--------------+ | Tables_in_DB | +--------------+ | Hits | | Tags | | HitTags | +--------------+ 下面是这些表中的一些示例列: mysql> select * from Hits; +---------+----------+---

我正在统计数据库中每个国家的点击率, 其中包含以下表格:

mysql> use DB; show tables;
+--------------+
| Tables_in_DB |
+--------------+
| Hits         |
| Tags         |
| HitTags      |
+--------------+
下面是这些表中的一些示例列:

mysql> select * from Hits;
+---------+----------+--------------+
| HitID   | HitDate  | HitText      |     
+---------+----------+--------------+
| 0123456 | 01/01/12 | access page1 |
| 7890123 | 01/02/12 | access page2 |
| 4567890 | 01/03/12 | access page3 |
+---------+----------+--------------+

mysql> select * from Tags;
+-----------+---------+---------+
| TagID     | TagType | TagText |     
+-----------+---------+---------+
| 123123213 | country | USA     |
| 456456456 | country | Brazil  |
| 789789789 | country | China   |
| 012345678 | city    | London  |
+-----------+---------+---------+

mysql> select * from HitTags;
+---------+-----------+
| HitID   | TagID     |
+---------+-----------+
| 0123456 | 123123213 |
| 7890123 | 456456456 |
| 4567890 | 789789789 |
+---------+-----------+
我想得到每个国家的点击率, 例如在以下SQL查询{和伪代码}中:

SELECT DISTINCT TagText, TagID FROM Tags
    WHERE TagType = 'country';

for each $row {
    SELECT COUNT(HitID) As HitCount FROM HitTags
        WHERE HitTags.TagID = $row[Tags.TagID];
}
在使用单独的查询时,我不反对这样做, 但我相信有一种方法可以更优雅地做到这一点 (即使用单个SQL查询,而不是每个国家/地区一个SQL查询)

可能使用连接,可能使用ANY关键字。 或者使用一些嵌套的SELECT语句

以下是我尝试过的:

SELECT COUNT(HitID) AS HitCount, TagText FROM HitTags
    JOIN Tags ON Tags.TagID =
    ANY (SELECT TagID FROM Tags WHERE TagType = 'country');
但这将返回一行所有点击总数(来自任何地方,尽管结果中列出了一个国家)

理想情况下,结果如下:

+---------+----------+
| TagText | HitCount |
+---------+----------+
|     USA |     1234 |
|  Brazil |     5678 |
|   China |     9012 |
+---------+----------+
我知道这一定很常见(如“是的,我在MySQL类101中看到过这个”)

我在网上搜索了很多次,但每个人似乎都在使用一个表(而不是三个)。我真的不擅长那种“一对多”的关系。对不起,我是个新手


任何想法、提示或建议都会很有用,提前谢谢

您只是缺少一个
分组依据
子句:

SELECT 
  COUNT(HitID) AS HitCount,
  TagText 
FROM HitTags
  JOIN Tags ON Tags.TagID =
    ANY (SELECT TagID FROM Tags WHERE TagType = 'country')
GROUP BY TagText;
实际上,使用
左连接更好:

SELECT
  COUNT(HitID) AS HitCount,
  TagText
FROM 
  Tags 
  LEFT JOIN HitTags ON Tags.TagID = HitTags.TagID
GROUP BY TagText
试试这个:

SELECT *, (SELECT COUNT(HitID) FROM HitTags WHERE TagID = t.TagID ) AS hit_count 
FROM Tags t WHERE TagType = 'country'
这也可以做到同样的效果,但我认为速度更快。

尝试以下方法

SELECT COUNT(HitID) AS HitCount, TagText FROM HitTags
JOIN Tags ON Tags.TagID =
ANY (SELECT TagID FROM Tags WHERE TagType = 'country')
group by TagText

回答得好!为了记录,我最后使用了一个内部连接(而不是左连接),结果查询如下:
选择DISTINCT TagText,COUNT(DISTINCT HitID)作为标记的HitCount LEFT join HitTags ON Tags.TagID,其中TagType='country'GROUP BY TagText