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

いいえ、その結果は得られません。次の 2 つのオプションがあります。

  1. 各 IP アドレスを独自の行で取得し、PHP で結果をインテリジェントにループします。

  2. GROUP_CONCAT() MySQL 関数を使用して IP アドレスを 1 つのフィールドに連結し、フィールドを解析して 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
  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

サンプル...

できないことの 1 つは、PHP に、 の値がip他の干渉のない配列であることを理解させることです。ただし、データを JSON に動的に構築するために、この少し厄介なことを行うこともできます。その後、単純に PHP に渡してjson_decode()、PHP のベクター型に簡単に変換することができます。

于 2012-06-08T20:35:04.087 に答える
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 に答える
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 に答える