今、私は次のクエリを持っています:
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回カウントされます)。
COUNT(DISTINCT ip)
を使用できます。これは個別の値のみをカウントします
_FROM tablename
_をFROM (SELECT DISTINCT * FROM tablename)
に置き換えると、たとえば次のように、必要な結果が得られます(重複した行は無視されます)。
_SELECT name, COUNT(*)
FROM (SELECT DISTINCT * FROM Table1) AS T1
GROUP BY name
_
テストデータの結果:
_dave 2
mark 2
_
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
以下を試してください:
SELECT DISTINCT(ip), name, COUNT(name) nameCnt,
time, price, SUM(price) priceSum
FROM tablename
WHERE time >= $yesterday AND time <$today
GROUP BY ip, name
どういうわけかあなたの要件は少し矛盾するように聞こえます..
名前でグループ化する(基本的には名前で区別し、集約する準備ができている)後、IPで区別する
指定された期間内に2人(名前)が同じIPから働いた場合、どうなると思いますか?
これを試しましたか?
SELECT name, COUNT(name), time, price, ip, SUM(price)
FROM tablename
WHERE time >= $yesterday AND time <$today
GROUP BY name,ip