MySQL запрос: ВЫБЕРИТЕ DISTINCT column1, GROUP BY column2 - PullRequest
19 голосов
/ 20 марта 2010

Прямо сейчас у меня есть следующий запрос:

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)?

Заранее спасибо.


[ОБНОВЛЕНИЕ]

Чтобы свести к минимуму путаницу, рассмотрим эту (упрощенную) таблицу БД:

|   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).

Ответы [ 5 ]

52 голосов
/ 20 марта 2010

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

13 голосов
/ 20 марта 2010

Замена 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 голосов
/ 20 марта 2010

Вы можете просто добавить 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
2 голосов
/ 07 июня 2013

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

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 голосов
/ 20 марта 2010

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

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

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


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

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