запрос mysql: ВЫБЕРИТЕ ОТЛИЧНЫЙ 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', т.е.

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

19
задан Adam Tal 20 March 2010 в 18:04
поделиться

4 ответа

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

54
ответ дан 30 November 2019 в 01:59
поделиться

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

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

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


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

SELECT name, COUNT(name), time, price, ip, SUM(price) 
  FROM tablename 
 WHERE time >= $yesterday AND time <$today 
GROUP BY name,ip
2
ответ дан 30 November 2019 в 01:59
поделиться

Замена FROM tablename на FROM (ВЫБЕРИТЕ ОТЛИЧНОЕ * ОТ имени таблицы) должна дать желаемый результат (игнорируя дубликаты строк), например:

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

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

dave 2
mark 2
13
ответ дан 30 November 2019 в 01:59
поделиться

Вы можете просто добавить 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
3
ответ дан 30 November 2019 в 01:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: