web-dev-qa-db-ja.com

mysqlクエリ:SELECT DISTINCT column1、GROUP BY column2

今、私は次のクエリを持っています:

SELECT name, COUNT(name), time, price, ip, SUM(price) 
  FROM tablename 
 WHERE time >= $yesterday 
   AND time <$today GROUP BY name

そして、私がやりたいことは、列「ip」でDISTINCTを追加することです、つまり.

SELECT DISTINCT ip FROM tablename 

したがって、最終的な出力は、すべての列、時間の今日のすべての行から、名前(繰り返し名ごとの名前カウント)でグループ化され、重複するIPアドレスはありません。

クエリはどのように表示されますか? (または、phpで出力に欠落しているフィルターを追加するにはどうすればよいですか?)

前もって感謝します。


[更新]

混乱を最小限に抑えるために、この(簡略化された)dbテーブルを検討してください。

|   name   |   ip   |
---------------------
|  mark    |  123   |
|  mark    |  123   |
|  mark    |  456   |
|  dave    |  789   |
|  dave    |  087   |

私が探している結果は、次のようなHTMLテーブルになります。

|  name    |  name count   |
----------------------------
|  mark    |      2        |
|  dave    |      2        |

私が現在得ているのは:

|  name    |  name count   |
----------------------------
|  mark    |      3        |
|  dave    |      2        |

(2回は同じIPであるにもかかわらず、マークは3回カウントされます)。

19
Adam Tal

COUNT(DISTINCT ip)を使用できます。これは個別の値のみをカウントします

53
knittl

_FROM tablename_をFROM (SELECT DISTINCT * FROM tablename)に置き換えると、たとえば次のように、必要な結果が得られます(重複した行は無視されます)。

_SELECT name, COUNT(*)
FROM (SELECT DISTINCT * FROM Table1) AS T1
GROUP BY name
_

テストデータの結果:

_dave 2
mark 2
_
13
Mark Byers

DISTINCT(ip)を追加するだけでかまいませんが、クエリの最初に来る必要があります。 SQL文字列に入る変数PHP変数を必ずエスケープしてください。

SELECT DISTINCT(ip), name, COUNT(name) nameCnt, 
time, price, SUM(price) priceSum
FROM tablename 
WHERE time >= $yesterday AND time <$today 
GROUP BY ip, name
3
Andy

以下を試してください:

SELECT DISTINCT(ip), name, COUNT(name) nameCnt, 
time, price, SUM(price) priceSum
FROM tablename 
WHERE time >= $yesterday AND time <$today 
GROUP BY ip, name
2
user2463590

どういうわけかあなたの要件は少し矛盾するように聞こえます..

名前でグループ化する(基本的には名前で区別し、集約する準備ができている)後、IPで区別する

指定された期間内に2人(名前)が同じIPから働いた場合、どうなると思いますか?


これを試しましたか?

SELECT name, COUNT(name), time, price, ip, SUM(price) 
  FROM tablename 
 WHERE time >= $yesterday AND time <$today 
GROUP BY name,ip
2
lexu