Подтвердить что ты не робот

Mysql query: 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

И то, что я хотел бы сделать, это добавить 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).

4b9b3361

Ответ 1

вы можете использовать COUNT(DISTINCT ip), это будет учитывать только отдельные значения

Ответ 2

Замена FROM tablename на FROM (SELECT DISTINCT * FROM tablename) должна дать вам результат, который вы хотите (игнорируя дублированные строки), например:

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

Результат для ваших тестовых данных:

dave 2
mark 2

Ответ 3

Вы можете просто добавить 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

Ответ 4

Как-то ваше требование звучит немного противоречиво.

группа по имени (которая в основном отличается от имени плюс готовность к агрегации), а затем отличается от IP

Как вы думаете, что должно произойти, если два человека (имена) работали от одного и того же IP-адреса в указанный период времени?


Вы пробовали это?

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

Ответ 5

Попробуйте следующее:

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