2016-03-20 43 views
2

我需要根據不同得到的hits總和ipMySQL的總和基於彼此不同科拉姆一個科拉姆算

到目前爲止,這是我想出:

SELECT 
COUNT(DISTINCT `ip`) AS `total`, 
SUM(`hits`) AS `sum` 
FROM `stats`.`stats` 
WHERE `category`=? 
GROUP BY `date` 

的樣本數據:

| category | ip | hits | date | 
| 11  | ip1 | 1000 | date1 | 
| 11  | ip2 | 1000 | date1 | 
| 11  | ip3 | 1000 | date1 | 
| 11  | ip4 | 1000 | date1 | 
| 11  | ip1 | 1000 | date1 | 

預期結果:

ip=4 
sum=4000 

我正在爲

ip=4 
sum=5000 

但是,這是給整個IP點擊,而是如果僅加不同的IP命中。

請建議一種方法來做到這一點。我寧願做類似

SUM(CASE WHEN `ip` THAN `hits`) 
//or 
SUM(CASE WHEN IN(`ip`) THAN `hits`) 
//or 
SUM(CASE WHEN IF(`ip`) THAN `hits`) 

而不是子查詢,因爲我需要快速查詢。 也使用array_unique PHP方面將對我有好處。

謝謝。

+0

您能否提供一些樣本數據? – Wanderer

+0

你是什麼意思「總結唯一不同的IP點擊」?這與計算訪問網站的不同IP有何不同? – Barmar

+0

@Ullas檢查有關樣本數據的更新 –

回答

2

你可以這樣說:

SELECT count(s.ip) as cntIp,sum(s.hits) as sumHits 
FROM(
    SELECT DISTINCT t.ip,t.hits 
    FROM YourTable t) s 

但它看起來像你所提供的數據是不準確的,我看到你按日期,這意味着日期等於而不是在你的例子中date1,date2,date3 ...

所以:

SELECT s.date,count(s.ip) as cntIp,sum(s.hits) as sumHits 
FROM(
    SELECT DISTINCT t.ip,t.hits,t.date 
    FROM YourTable t) s 
GROUP BY s.date 

編輯:

SELECT s.date,count(s.ip) as cntIp,sum(s.hits) as sumHits 
FROM(
    SELECT t.ip,t.hits,t.date 
    FROM YourTable t 
    GROUP BY t.ip,t.hits,t.date) s 
GROUP BY s.date 
+0

更正的問題也可以在沒有子查詢的情況下完成嗎? –

+0

@tallboy不是我能想到的,但第二個查詢應該可以完美工作 – sagi

+0

可以使用'CASE WHEN'而不是子查詢 –

0

你可以試試這個

SELECT 
    `ip` 
    COUNT(`ip`) AS `total`, 
    SUM(`hits`) AS `sum` 
FROM 
    `stats`.`stats` 
WHERE 
    `category`=? 
GROUP BY   
    `date`, 
    `ip` 
+0

相同的結果不會計算不同的點擊 –

+0

因此,您可以先嚐試Group By IP.I認爲它會工作 –

+0

I首先需要分組,然後檢查ip的 –

1

你需要編寫一個返回每個IP /日的最小目標值的子查詢。然後你可以總結這些。

SELECT date, count(*) as sum, sum(minhits) as hits 
FROM(
    SELECT ip, date, MIN(hits) AS minhits 
    FROM stats 
    WHERE category = ? 
    GROUP BY ip, date) AS subquery 
GROUP BY date