Ответ 1
вы можете использовать COUNT(DISTINCT ip)
, это будет учитывать только отдельные значения
Сейчас у меня есть следующий запрос:
SELECT name, COUNT(name), time, price, ip, SUM(price)
FROM tablename
WHERE time >= $yesterday
AND time <$today GROUP BY name
И то, что я хотел бы сделать, это добавить DISTINCT по столбцу "ip", т.е.
SELECT DISTINCT ip FROM tablename
Таким образом, моим окончательным результатом будут все столбцы, из всех строк, где сегодня время, сгруппированы по имени (с указанием имени для каждого повторяющегося имени) и не дублируются IP-адреса.
Как должен выглядеть мой запрос? (или, альтернативно, как я могу добавить отсутствующий фильтр к выходу с помощью php)?
Спасибо заранее.
[UPDATE]
Чтобы свести к минимуму путаницу, рассмотрите эту (упрощенную) таблицу 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 |
(он отмечает отметку 3 раза, хотя два раза с одним и тем же ip).
вы можете использовать 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)
, но он должен прийти в начале запроса. Обязательно избегайте переменных PHP, которые входят в строку SQL.
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
Как вы думаете, что должно произойти, если два человека (имена) работали от одного и того же IP-адреса в указанный период времени?
Вы пробовали это?
SELECT name, COUNT(name), time, price, ip, SUM(price)
FROM tablename
WHERE time >= $yesterday AND time <$today
GROUP BY name,ip
Попробуйте следующее:
SELECT DISTINCT(ip), name, COUNT(name) nameCnt,
time, price, SUM(price) priceSum
FROM tablename
WHERE time >= $yesterday AND time <$today
GROUP BY ip, name