1

好的,我有一个这样的表:

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 列表附加到查询计数显示(单击以显示/隐藏填充信息的模式)。

任何获得我需要的数据的方向或帮助都会很棒!

4

6 回答 6

6

不,你不能得到那个结果。你有两个选择:

  1. 在自己的行中获取每个 IP 地址并智能地循环遍历 PHP 中的结果。

  2. 使用GROUP_CONCAT() MySQL 函数将 IP 地址连接到一个字段中,并解析该字段以在 PHP 中将它们分开。

于 2012-06-08T20:05:14.820 回答
2

它不会是一个嵌套数组,但你可以有类似的东西

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

你在哪里分组查询和 ip

于 2012-06-08T20:05:29.480 回答
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

不幸的是,您不能使用嵌套数组,但这非常接近。

于 2012-06-08T20:07:29.013 回答
2

group_concat()可以很好地解决这个问题。但请记住在 group_concat() 中使用 distinct(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      |
+-----+--------+---------+----------------------------+

当我在 group_concat 中运行没有 distinct(ip) 的查询时:

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 |
+-----+--------+---------+----------------------------------+
于 2012-06-08T20:17:03.253 回答
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

样品...

The one thing you cannot do is have PHP understand that the value of ip is an array with no other interference. However, you could do this slightly nasty thing to dynamically construct the data into JSON, and then it can simply be passed to json_decode() in PHP to easily convert it to a PHP vector type.

于 2012-06-08T20:35:04.087 回答
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_CONCATip字段组合成一个逗号分隔的字符串。

于 2012-06-08T20:05:33.200 回答