2012-06-08 62 views
1

好吧,我有一個表是這樣的:我可以使用單個SQL查詢來做到這一點嗎?

id query results ip 
--------------------------------- 
1 milk 17  10.10.10.1 
2 milk 17  10.10.10.1 
3 milk 17  10.10.10.2 
4 bread 8  10.10.10.2 
5 bread 8  10.10.10.2 
6 cheese 12  10.10.10.1 

我有這個疑問現在:

SELECT COUNT(DISTINCT(id)) as cnt, query, results, ip 
FROM table 
GROUP BY query 
ORDER BY results ASC 
LIMIT 20 

該查詢返回的結果:

count query results 
--------------------- 
2  bread 8 
1  cheese 12 
3  milk 17 

我需要擴大在那個查詢上(或者完全重做)來返回類似這樣的內容,最好使用嵌套數組中的IP作爲查詢數組的一部分:

query count results ip 
-------------------------------- 
bread 2  8  10.10.10.2 (2) 
cheese 1  12  10.10.10.1 (1) 
milk 3  17  10.10.10.1 (2) 
         10.10.10.2 (1) 

我會輸出這與PHP,將IP列表與該計數附加到查詢計數顯示(點擊以顯示/隱藏模式與信息填充)。

任何方向或幫助獲取我需要的數據將是美好的!

+0

你的意思是'DISTINCT'對嗎? :-) –

+0

期望的結果集違反1NF。您可能想要考慮更好的查詢方式。 –

+0

可能[SQL加入自己](http://www.w3resource.com/sql/joins/join-a-table-to-itself.php)? – Vidul

回答

2

這個問題的答案(儘管多次有相反的主張)是「可以呀,一個派生表」 :

SELECT 
    SUM(cnt) as cnt, 
    query, results, 
    GROUP_CONCAT(ip SEPARATOR '\n') AS ip 
FROM (
    SELECT 
    query, results, 
    COUNT(DISTINCT(id)) as cnt, 
    CONCAT(ip, '(', COUNT(ip), ')') AS ip 
    FROM test 
    GROUP BY query, ip 
) t 
GROUP BY query 
ORDER BY results ASC 
LIMIT 20 

Sample ...

的一件事,你不能確實有PHP瞭解,ip的值是一個沒有其他干擾的數組。但是,您可以使用this slightly nasty thing動態構建數據到JSON中,然後可以簡單地將它傳遞到PHP中的json_decode()以輕鬆將其轉換爲PHP矢量類型。

+0

這真是太棒了,謝謝! – SickHippie

6

不,你不能得到那個結果。您有兩種選擇:

  1. 通過PHP中的結果智能地獲取每個IP地址的自己的行和循環。

  2. 使用GROUP_CONCAT() MySQL函數將IP地址連接在一個字段中,並解析該字段以在PHP中分隔它們。

2

這不會是一個嵌套的數組,但你可以有類似

SELECT query, results, ip, COUNT(ip) AS cnt 
FROM table 
GROUP BY query, ip 
ORDER BY results ASC 
LIMIT 20 

,你在查詢和IP組

+1

[Sass * me * for hoopy frood * I * am](http://sqlfiddle.com/#!2/3c2b3/26)...我知道你真的不在乎,但我只是炫耀對於我真正尊重意見的人:-D – DaveRandom

1

試試這個:

SELECT COUNT(DISTINCT(id)) as cnt, query, results, GROUP_CONCAT(ip) AS ip 
FROM table 
GROUP BY query 
ORDER BY results ASC 
LIMIT 20 

GROUP_CONCAT將把ip字段組合成逗號分隔的字符串。

2

像這樣的東西可能是你需要的東西:

SELECT COUNT(DISTINCT(id)) as cnt, query, results, ip 
FROM table 
GROUP BY query, ip 
ORDER BY results ASC 
LIMIT 20 

這會給你這樣的結果:

query count results ip 
---------------------------------- 
bread 2  8  10.10.10.2 
cheese 1  12  10.10.10.1 
milk 2  17  10.10.10.1 
milk 1  17  10.10.10.2 

不幸的是,你不能用一個嵌套的數組,但這是相當接近。

2

group_concat()對此很有效。但請記住在group_concat()內部使用不同的(ip)。

以下是我嘗試從MySQL的工作查詢。

SELECT COUNT(DISTINCT(id)) as cnt, query, results, GROUP_CONCAT(DISTINCT(ip)) 
FROM table 
GROUP BY query 
ORDER BY results ASC LIMIT 20; 

+-----+--------+---------+----------------------------+ 
| cnt | query | results | group_concat(distinct(ip)) | 
+-----+--------+---------+----------------------------+ 
| 2 | bread |  8 | 10.10.10.2     | 
| 1 | cheese |  12 | 10.10.10.1     | 
| 3 | milk |  17 | 10.10.10.1,10.10.10.2  | 
+-----+--------+---------+----------------------------+ 

當我運行沒有明顯的(IP)的查詢中GROUP_CONCAT:

SELECT COUNT(DISTINCT(id)) as cnt, query, results, group_concat(ip) 
FROM table 
GROUP BY query 
ORDER BY results ASC LIMIT 20; 

+-----+--------+---------+----------------------------------+ 
| cnt | query | results | group_concat(ip)     | 
+-----+--------+---------+----------------------------------+ 
| 2 | bread |  8 | 10.10.10.2,10.10.10.2   | 
| 1 | cheese |  12 | 10.10.10.1      | 
| 3 | milk |  17 | 10.10.10.1,10.10.10.1,10.10.10.2 | 
+-----+--------+---------+----------------------------------+ 
+0

您不需要* GROUP_CONCAT中的DISTINCT。 –

+0

檢查更新後的答案。這就是我得到的。 – varunl

相關問題