2010-03-20 3 views
18

Сейчас у меня есть следующий запрос:MySQL запросов: 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 на колонке 'ф', то есть

SELECT DISTINCT ip FROM tablename 

Таким образом, моим окончательным результатом будут все столбцы из всех строк, в которых есть время, сгруппированное по имени (с указанием имени для каждого повторяющегося имени) и не дублирующихся IP-адресов.

В чем должен быть мой запрос? (или, альтернативно, как я могу добавить отсутствующий фильтр к выходу с помощью php)?

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


[UPDATE]

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

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

+0

Я также попытался SELECT DISTINCT внутрибрюшинно FROM (SELECT имя, COUNT (имя), время, цена, IP, SUM (цена) FROM имя_таблицы WHERE время> = $ вчера и время <$ сегодня GROUP BY) как ТАБЛИЦА Но я получаю синтаксическую ошибку ... –

+0

** Попробуйте: ** SELECT DISTINCT ** TABLE.ip ** FROM (SELECT T.name, COUNT (T.name), T.time , T.price, T.ip, SUM (T.price) FROM tablename T WHERE time> = $ вчера И время <$ сегодня GROUP BY name) как ТАБЛИЦА – lexu

+0

- «предоставленный аргумент не является допустимым ресурсом результатов MySQL» :( –

ответ

48

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

+0

yep, но это не решает мою проблему :) спасибо –

+0

Adam: Почему это не решит вашу проблему? –

+0

О, держись, подожди. Попытка воспроизвести запрос, чтобы ответить на вопрос Маркса, показывает: ЭТО РАБОТАЕТ !!!!! Я не могу в это поверить. Я думаю, что могу заплакать. –

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 
+0

Пробовал добавлять DISTINCT (ip) в начале, не работал, он просто игнорирует его. Откуда взялось название nameCnt? я пишу запрос неправильно? (Он работал со мной без имени nameCnt 'и' priceSum раньше, за исключением вещи DISTINCT) .... –

+0

Лучше псевдоним столбцов, чтобы вы могли ссылаться на них с помощью псевдонима в PHP, а не на использование $ result ['COUNT (name)'] - вместо этого с псевдонимом $ result ['nameCnt']. Я думаю, вам нужно будет «GROUP BY ip, name», answer updated – Andy

+1

Вы не можете этого сделать - разные функции не являются функциями; это ключевое слово, которое применяется ко всей строке, или модификатор для агрегатной функции. В вашем случае это ключевое слово для SELECT, поэтому оно должно появиться перед именами столбцов. Скобки, которые вы положили вокруг «ip», просто декоративны. –

2

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

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

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


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

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

Я попробовал, не получил нужного результата. Причина, по которой я хочу использовать DISTINCT на ip, я не хочу дублировать ip. Причина, по которой я хочу использовать GROUP BY по имени, - это так, что я могу подсчитать имена (например, показать одну строку таблицы, которая говорит мне, сколько людей с именем «mark» есть). Я не (и не буду) иметь два имени на одном IP-адресе в моем db. –

+0

Что касается имени GROUP BY, ip ... Это не решило проблему, я думаю, что она группируется только по первому столбцу и игнорирует вторую. –

+0

@Adam: Он группируется по имени и IP .. вы можете видеть это легче, перемещая IP во вторую позицию списка выбора. – lexu

13

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

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

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

dave 2 
mark 2 
+0

Звучит неплохо. Как мне извлечь данные?(Никогда раньше не использовался SELECT в SELECT). Столик таблицы 1? Что такое T1? Заранее спасибо –

+1

@Adam: Да, 'Table1' - это имя вашей таблицы, а' T1' - псевдоним для этого подзапроса, поэтому вы также можете написать 'SELECT T1.name, ...'. MySQL требует псевдонимов для всех подзапросов (+1 для этого ответа). –

+0

Спасибо, Питер, и Марк. Как использовать данные в моем php? Я использовал $ data = mysql_query ("SELECT ..."), а затем while ($ row = mysql_fetch_array ($ data)) {echo $ row ['name']; echo $ row ['COUNT (name)']; } Но теперь он возвращается пустым. –

2

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

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

Доступны ли функции агрегата с функциями DISTINCT? –