簡體   English   中英

只需數一數

[英]Simply count one-to-many

我試圖計算數據庫中每個國家/地區的點擊數,該數據庫具有以下表格:

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查詢而不是每個國家/地區)。

也許使用JOIN,也許使用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中看到了”)...

我在網上搜索了很多,但每個人似乎都在使用一個表(而不是三個表)。 這些“一對多”的關系對我真的不好。 抱歉成為這樣的新手!

任何想法,提示或建議都會有用,在此先感謝您!

您只是缺少GROUP BY子句:

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

實際上,使用LEFT JOIN會更好:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM