Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » подсчет уникальных значаний поля в MySQl

Ответить
Настройки темы
подсчет уникальных значаний поля в MySQl

Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


у меня сейчас вот такой запрос:
Код: Выделить весь код
  $QueryStringList = mysql_query('SELECT IF( LOCATE("?", l.QueryString) = 0, l.QueryString, LEFT(l.QueryString, LOCATE("?", l.QueryString)  - 1) ) as QueryString,
                                  count(*) as Count,
                                  sum(l.ByteSent) as AllByteSent,
                                  l.Result,
                                  sum(l.ByteSent) / '.$MaxByte['Max'].' as prb,
                                  count(*) / '.$MaxCount['Max'].' as prc
                             FROM logs as l, brouser as b
                            WHERE l.Date >= "'.$StartDate.'"
                              AND l.Date <= "'.$EndDate.'"
                              AND ( '.$r.' )
                              AND b.id=l.Brouser
                         GROUP BY l.QueryString, l.Result
                         '.$sort.';') or print mysql_error();
а хочется нечто вот такое:
Код: Выделить весь код
  $QueryStringList = mysql_query('SELECT IF( LOCATE("?", l.QueryString) = 0, l.QueryString, LEFT(l.QueryString, LOCATE("?", l.QueryString)  - 1) ) as QueryString,
                                  count(*) as Count,
                                  ХХХ(IP) as nIp,
                                  sum(l.ByteSent) as AllByteSent,
                                  l.Result,
                                  sum(l.ByteSent) / '.$MaxByte['Max'].' as prb,
                                  count(*) / '.$MaxCount['Max'].' as prc
                             FROM logs as l, brouser as b
                            WHERE l.Date >= "'.$StartDate.'"
                              AND l.Date <= "'.$EndDate.'"
                              AND ( '.$r.' )
                              AND b.id=l.Brouser
                         GROUP BY l.QueryString, l.Result
                         '.$sort.';') or print mysql_error();
только вот не знаю что поставить всместо XXX?

сдается что такого нельзя осуществить

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 22:04, 16-06-2004

 
mar mar вне форума

Аватара для mar

just mar


Moderator


Сообщения: 3904
Благодарности: 163

Профиль | Отправить PM | Цитировать


Vlad Drakula
а что xxx делать должна ?

Отправлено: 22:57, 16-06-2004 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83

Профиль | Сайт | Отправить PM | Цитировать


XXX() - нечто вроде count() только он ститает каличество уникальных значений, а не общее количество полей.

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 23:09, 16-06-2004 | #3

mar mar вне форума

Аватара для mar

just mar


Moderator


Сообщения: 3904
Благодарности: 163

Профиль | Отправить PM | Цитировать


count(IP) .... group by IP и JOIN это к основному запросу
(в postgres-е можно было бы запрос в запросе сделать )

Отправлено: 23:12, 16-06-2004 | #4


Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83

Профиль | Сайт | Отправить PM | Цитировать


mar
честно говоря я с  JOIN я не разобрался, может ты просветишь меня?

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 23:17, 16-06-2004 | #5

mar mar вне форума

Аватара для mar

just mar


Moderator


Сообщения: 3904
Благодарности: 163

Профиль | Отправить PM | Цитировать


в общем виде JOIN - аналог выбора из двух таблиц, связанных между собой по каким-то полям (полю)
SELECT a.id, b.qq FROM a_table a, b_table_b WHERE a.column1=b.column2;
можно записать, как *
SELECT a.id, b.qq FROM a_table a
JOIN b_table_b ON a.column1=b.column2;
(или, по крайней мере в постгресе можно еще сказать USING c, если с - поле связи, одинаково названное в обоих таблицах.

Дальше начинается самое интересное, когда можно присоединять не все данные одной, или другой таблицы
LEFT JOIN, RIGHT JOIN
Тут надо иметь в виду оптимизацию запросов в mysql
Дальше еще интересней, но, честно говоря, по-моему, это не должно работать : в постгресе (и, по-моему вообще по SQL-стандартам, поправьте кто-нибудь, если не так можно на связываемые таблицы наложить разные (в том числе и по order и group by условия), например: (кусок работающего примера из postgres-а)
Код: Выделить весь код
 
SELECT ............ 
FROM participant_view p 
JOIN 
 * *( 
 * * *SELECT 
 * *	 * *dst, src, 
 * *	 * *0- sum(amount) AS amount, 
	 * *currency 
 * * *FROM trlog 
 * * *WHERE 
 * *	stamp <= '%s' AND 
	status = %d GROUP BY dst, currency, src 
 * *) t ON (t.dst = p.id and t.src > 0) 
JOIN currency c ON (c.id=t.currency) 
 ...... 
 ORDER BY p.name
Вот. Собственно, когда я писала - имела в виду последний случай, но, боюсь, он в MySQL смысла не имеет
В твоем случае, скорее, для MYSQL можно использовать UNION


Отправлено: 09:53, 18-06-2004 | #6


Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83

Профиль | Сайт | Отправить PM | Цитировать


mar
ох... много раз у меня баз аданных умирала...
но всетаки я написал...
вот что уменя получилось:
Код: Выделить весь код
  $LogList = mysql_query('SELECT l.Date,
                                 count(*) as Count,
                                 sum(l.ByteSent) as AllByteSent,
                                 sum(l.ByteSent) / '.$MaxByte['Max'].' as prb,
                                 count(*) / '.$MaxCount['Max'].' as prc,
                                 l2.C as C
                            FROM logs as l
                       LEFT JOIN ( SELECT l3.Date,
                                          count(*) as C
                                     FROM ( SELECT Date
                                              FROM logs
                                          GROUP BY Date, FromIp) as l3
                         GROUP BY l3.Date) as l2 ON l.Date = l2.Date
                           WHERE l.Date >= "'.$StartDate.'"
                             AND l.Date <= "'.$EndDate.'"
                        GROUP BY l.Date, l2.Date
                        '.$sort.';') or print mysql_error();
но работает все это очень медленно

буду оптимизировать.

Добавлено:

в итоге было:
Код: Выделить весь код
  $MaxByte = mysql_fetch_array(mysql_query('SELECT sum(ByteSent) as Max
                                              FROM logs
                                             WHERE Date >= "'.$StartDate.'"
                                               AND Date <= "'.$EndDate.'"
                                          GROUP BY Date
                                          ORDER BY Max DESC;'));

  $MaxCount = mysql_fetch_array(mysql_query('SELECT count(*) as Max
                                              FROM logs
                                             WHERE Date >= "'.$StartDate.'"
                                               AND Date <= "'.$EndDate.'"
                                          GROUP BY Date
                                          ORDER BY Max DESC;'));


  $LogList = mysql_query('SELECT l.Date, 

                                 count(*) as Count, 

                                 sum(l.ByteSent) as AllByteSent, 

                                 sum(l.ByteSent) / '.$MaxByte['Max'].' as prb, 

                                 count(*) / '.$MaxCount['Max'].' as prc, 

                                 l2.C as C 

                            FROM logs as l 

                       LEFT JOIN ( SELECT l3.Date, 

                                          count(*) as C 

                                     FROM ( SELECT Date 

                                              FROM logs 

                                          GROUP BY Date, FromIp) as l3 

                         GROUP BY l3.Date) as l2 ON l.Date = l2.Date 

                           WHERE l.Date >= "'.$StartDate.'" 

                             AND l.Date <= "'.$EndDate.'" 

                        GROUP BY l.Date, l2.Date 

                        '.$sort.';') or print mysql_error();
стало:

Код: Выделить весь код
  $LogList = mysql_query('SELECT l1.*,
                                 l1.Count / m.Max_Count as prc,
                                 l1.AllByteSent / m.Max_Byte as prb,
                                 l2.C
                            FROM ( SELECT Date,
                                          count(*) as Count,
                                          sum(ByteSent) as AllByteSent
                                     FROM logs
                                    WHERE Date >= "'.$StartDate.'"
                                      AND Date <= "'.$EndDate.'"
                                 GROUP BY Date
                                          '.$sort.') as l1,
                                 ( SELECT l3.Date,
                                          count(*) as C
                                     FROM ( SELECT Date
                                              FROM logs
                                          GROUP BY Date, FromIp) as l3
                                 GROUP BY l3.Date) as l2,
                                 ( SELECT MAX(m1.Max_Byte) as Max_Byte,
                                          MAX(m2.Max_Count) as Max_Count
									      FROM ( SELECT Date,
                                                        sum(ByteSent) as Max_Byte
                                                   FROM logs
                                               GROUP BY Date
                                               ORDER BY Max_Byte DESC) as m1
                                     LEFT JOIN ( SELECT Date,
                                                        count(*) as Max_Count
                                                   FROM logs
                                                  WHERE Date >= "'.$StartDate.'"
                                                    AND Date <= "'.$EndDate.'"
                                               GROUP BY Date
                                               ORDER BY Max_Count DESC) as m2
                                          USING( Date )) as m
                           WHERE l1.Date=l2.Date;') or print mysql_error();

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 19:49, 18-06-2004 | #7

mar mar вне форума

Аватара для mar

just mar


Moderator


Сообщения: 3904
Благодарности: 163

Профиль | Отправить PM | Цитировать


ух ты! верной дорогой идете товарищ-щ-щи!!!

Отправлено: 21:45, 18-06-2004 | #8


Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83

Профиль | Сайт | Отправить PM | Цитировать


к сожалению находятся люди которые утверждают что я ламммер в части баз данных

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 22:13, 18-06-2004 | #9


Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


Это не так, можешь приезжать ко мне и я выдам тебе разрешение на плевок в левый глаз за клевету

-------
Не могу дать более дельный совет - не хватает системных ресурсов...


Отправлено: 00:04, 19-06-2004 | #10



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » подсчет уникальных значаний поля в MySQl

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Прочее - [решено] поля tracert вывода nmn Сетевые технологии 2 05-12-2008 17:36
MSFT SQL Server - копирование поля с RTF документом toro Программирование и базы данных 6 16-09-2008 00:54
PHP и мемо-поля MS SQL Zarenkova Вебмастеру 3 16-01-2008 02:57
Размер поля Text pauluss Вебмастеру 3 04-03-2004 22:54
пароль для поля Guest Программирование и базы данных 1 02-11-2003 12:00




 
Переход