Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Регулярные выражения в SQL
 
 автор: Евгений Петров   (24.08.2005 в 19:36)   письмо автору
 
 

Есть таблица
---------------------------------
|            host               |
---------------------------------
| http://url1.ru/index.php?id=1 |
| http://url1.ru/index.php?id=2 |
| http://url2.ru/index.php?id=1 |
| http://url2.ru/index.php?id=2 |
| http://url2.ru/index.php?id=2 |
---------------------------------

Как выбрать из этой таблицы уникальные значения хостов и их количество?
---------------
| url1.ru | 2 |
| url2.ru | 3 |
---------------

   
 
 автор: cheops   (24.08.2005 в 20:27)   письмо автору
 
   для: Евгений Петров   (24.08.2005 в 19:36)
 

Нет с регуярными выражениями не получится... нет подходящей режущей функции... следует обходиться строковыми функциями
SELECT SUBSTRING_INDEX(host, '/', 3) AS total, COUNT(SUBSTRING_INDEX(host, '/', 3)) FROM tbl GROUP BY total

   
 
 автор: Евгений Петров   (24.08.2005 в 22:21)   письмо автору
 
   для: cheops   (24.08.2005 в 20:27)
 

Огромное спасибо, ещё раз убедился в "могучести" языка SQL. :)

   
 
 автор: Евгений Петров   (25.08.2005 в 15:24)   письмо автору
 
   для: Евгений Петров   (24.08.2005 в 22:21)
 

Небольшая поправка. Как проделать то же самое со следующей таблицей:
+-------------------------------+
|            host               |
+-------------------------------+
| http://url1.ru                |
| http://url1.ru/index.php?id=2 |
| http://url2.ru/index.php?id=1 |
| www.url2.ru/index.php?id=2    |
| url2.ru/index.php?id=2        |
+-------------------------------+

Вывести должен то же самое.

   
 
 автор: Евгений Петров   (25.08.2005 в 16:59)   письмо автору
 
   для: Евгений Петров   (25.08.2005 в 15:24)
 

Вот ещё проблемка. Есть таблица.
+--------------------------+---------------------+------------+
|         url            |         time      |    sid     | 
+--------------------------+---------------------+------------+
| http://site.ru/page5.htm | 2005-08-25 14:39:03 | 1124969933 |
| http://site.ru/page1.htm | 2005-08-25 14:39:13 | 1124969933 |
| http://site.ru/page4.htm | 2005-08-25 14:39:34 | 1124969933 |
| http://site.ru/page4.htm | 2005-08-25 14:40:55 | 1124970049 |
| http://site.ru/page5.htm | 2005-08-25 14:41:06 | 1124970049 |
| http://site.ru/page1.htm | 2005-08-25 14:41:17 | 1124970049 |
| http://site.ru/page3.htm | 2005-08-25 14:41:27 | 1124970049 |
| http://site.ru/page4.htm | 2005-08-25 15:45:42 | 1124973942 |
| http://site.ru/page4.htm | 2005-08-25 15:45:50 | 1124973942 |
| http://site.ru/page4.htm | 2005-08-25 15:45:57 | 1124973942 |
+--------------------------+---------------------+------------+

В ней первый столбец - адрес страницы, второй - время захода, третий идентификатор сесии.
Мне нужно извлечь из таблицы уникальные страницы и их количество для которых в пределах одной сессии время наименьшее.
Все до чего я пока додумался - это запрос
SELECT url,MIN(time) FROM counter GROUP BY sid

Который выведет:
+--------------------------+---------------------+
|           url            |      MIN(time)      | 
+--------------------------+---------------------+
| http://site.ru/page5.htm | 2005-08-25 14:39:03 |
| http://site.ru/page4.htm | 2005-08-25 14:40:55 |
| http://site.ru/page4.htm | 2005-08-25 15:45:42 |
+--------------------------+---------------------+


Но мне надо чтобы оно вывело

+--------------------------+------------+
|           url            | COUNT(url) |
+--------------------------+------------+
| http://chat.ru/page5.htm |      1     |
| http://chat.ru/page4.htm |      2     |
+--------------------------+------------+

Как не знаю, но думаю, что можно это все одним SQL запросом сделать. :)
Заранее спасибо!

   
 
 автор: Евгений Петров   (25.08.2005 в 19:53)   письмо автору
 
   для: Евгений Петров   (25.08.2005 в 16:59)
 

История с SQL продолжается. :) Не могу понять в чем проблема. Вот таблица:
+--------------------------+---------------------+------------+
|           url            |        time         |    sid     |
+--------------------------+---------------------+------------+
| http://chat.ru        | 2005-08-25 18:19:30 | 1124981868 | 
| http://chat.ru/page4.htm | 2005-08-25 18:19:42 | 1124981868 |
| http://chat.ru/page2.htm | 2005-08-25 17:59:04 | 1124981944 |
| http://chat.ru/page3.htm | 2005-08-25 17:59:11 | 1124981944 |
+--------------------------+---------------------+------------+

Запрос:
SELECT url,MIN(time) FROM counter GROUP BY sid

Выводит на мой взгляд правильный результат:
+--------------------------+---------------------+
|         url              |     MIN( time )     |
+--------------------------+---------------------+
| http://chat.ru           | 2005-08-25 18:19:30 | 
| http://chat.ru/page2.htm | 2005-08-25 17:59:04 |
+--------------------------+---------------------+

А вот запрос:
SELECT url,MAX(time) FROM counter GROUP BY sid

на мой взгляд выводит не совсем те результаы, которые я ожидал:
+--------------------------+---------------------+
|         url              |     MIN( time )     |
+--------------------------+---------------------+
| http://chat.ru           | 2005-08-25 18:19:42 | 
| http://chat.ru/page2.htm | 2005-08-25 17:59:11 |
+--------------------------+---------------------+


Почему запрос вывел url с других строк?

   
 
 автор: cheops   (25.08.2005 в 22:38)   письмо автору
 
   для: Евгений Петров   (25.08.2005 в 19:53)
 

Потому что группировка по sid проводится.

   
 
 автор: Евгений Петров   (25.08.2005 в 22:43)   письмо автору
 
   для: cheops   (25.08.2005 в 22:38)
 

А как сделать чтоб выводилось то что надо?

   
 
 автор: cheops   (25.08.2005 в 23:59)   письмо автору
 
   для: Евгений Петров   (25.08.2005 в 22:43)
 

Если требуется группировка по sid в один запрос может не получиться...

   
 
 автор: Евгений Петров   (26.08.2005 в 00:01)   письмо автору
 
   для: cheops   (25.08.2005 в 23:59)
 

Надо чтобы вывелось то же самое, только, чтоб url были из тех строк из которых и выведенное время

   
 
 автор: cheops   (26.08.2005 в 13:10)   письмо автору
 
   для: Евгений Петров   (26.08.2005 в 00:01)
 

Нет в один запрос не получится придётся выбирать уникальные sid - число, а потом в цикле по уникальным sid организовывать дополнительные запросы на выборку URL и времени.

   
 
 автор: Евгений Петров   (27.08.2005 в 15:32)   письмо автору
 
   для: cheops   (26.08.2005 в 13:10)
 

А разве запрос может выбрать из базы данные из разных строк?

   
 
 автор: cheops   (27.08.2005 в 21:24)   письмо автору
 
   для: Евгений Петров   (27.08.2005 в 15:32)
 

Если честно то не очень понял вопрос :)))

   
 
 автор: Евгений Петров   (27.08.2005 в 21:33)   письмо автору
 
   для: cheops   (27.08.2005 в 21:24)
 

Вот смотрите у меня таблица:
+--------------------------+---------------------+------------+
|           url            |        time         |    sid     |
+--------------------------+---------------------+------------+
| http://chat.ru           | 2005-08-25 18:19:30 | 1124981868 |
| http://chat.ru/page4.htm | 2005-08-25 18:19:42 | 1124981868 |
| http://chat.ru/page2.htm | 2005-08-25 17:59:04 | 1124981944 |
| http://chat.ru/page3.htm | 2005-08-25 17:59:11 | 1124981944 |
+--------------------------+---------------------+------------+

SELECT url,MIN(time) FROM counter GROUP BY sid

Выводит все правильно:
+--------------------------+---------------------+
|         url              |     MIN( time )     |
+--------------------------+---------------------+
| http://chat.ru           | 2005-08-25 18:19:30 |
| http://chat.ru/page2.htm | 2005-08-25 17:59:04 |
+--------------------------+---------------------+

Посмотрите и url и time находятся в одной строке
А
SELECT url,MAX(time) FROM counter GROUP BY sid

Выводит какую то фигню:
+--------------------------+---------------------+
|         url              |     MIN( time )     |
+--------------------------+---------------------+
| http://chat.ru           | 2005-08-25 18:19:42 |
| http://chat.ru/page2.htm | 2005-08-25 17:59:11 |
+--------------------------+---------------------+

Смотрите 2005-08-25 18:19:42 и http://chat.ru в таблице находятся в разных строках и 2005-08-25 17:59:11 и http://chat.ru/page2.htm тоже в разных строках.

   
 
 автор: cheops   (28.08.2005 в 11:41)   письмо автору
 
   для: Евгений Петров   (27.08.2005 в 21:33)
 

Когда используется GROUP BY, т.е. url берётся от фонаря какой ближе, и агрегатная функция по другому столбцу (MIN, MAX), к сожалению, это возможно. MIN() и MAX() возвращают минимальное и максимальное значения в пределах группы образованной GROUP BY - поэтому в этом случае чаще прибегают к циклу.

   
 
 автор: Евгений Петров   (28.08.2005 в 14:15)   письмо автору
 
   для: cheops   (28.08.2005 в 11:41)
 

Ясно спасибо.

   
 
 автор: Евгений Петров   (07.09.2005 в 21:09)   письмо автору
 
   для: Евгений Петров   (28.08.2005 в 14:15)
 

Cheops чего то уменя не очень получается. Подскажите пожалуйста как мне из этой таблицы вывести следующие записи:
Таблица:
 +--------------------------+---------------------+------------+
|           url            |        time         |    sid     |
+--------------------------+---------------------+------------+
| http://chat.ru           | 2005-08-25 18:19:30 | 1124981868 |
| http://chat.ru/page4.htm | 2005-08-25 18:19:42 | 1124981868 |
| http://chat.ru/page2.htm | 2005-08-25 17:59:04 | 1124981944 |
| http://chat.ru/page3.htm | 2005-08-25 17:59:11 | 1124981944 |
+--------------------------+---------------------+------------+

Нужно вывести:

+--------------------------+---------------------+------------+
|           url            |        time         |    sid     |
+--------------------------+---------------------+------------+
| http://chat.ru           | 2005-08-25 18:19:30 | 1124981868 |
| http://chat.ru/page2.htm | 2005-08-25 17:59:04 | 1124981944 |
+--------------------------+---------------------+------------+

и
+--------------------------+---------------------+------------+
|           url            |        time         |    sid     |
+--------------------------+---------------------+------------+
| http://chat.ru/page4.htm | 2005-08-25 18:19:42 | 1124981868 |
| http://chat.ru/page3.htm | 2005-08-25 17:59:11 | 1124981944 |
+--------------------------+---------------------+------------+

Т.е. записи с минимальным и максимальным time в пределах группы sid. Заранее большое спасибо!

   
 
 автор: cheops   (08.09.2005 в 13:14)   письмо автору
 
   для: Евгений Петров   (07.09.2005 в 21:09)
 

Осуществлять запросы
SELECT MAX(time), sid AS time FROM tbl GROUP BY sid ORDER BY time

и
SELECT MIN(time), sid AS time FROM tbl GROUP BY sid ORDER BY time

А затем в цикле обработки для каждой записи выполнять запрос
SELECT url FROM tbl WHERE sid = $sid AND time = '$time'

   
 
 автор: Евгений Петров   (08.09.2005 в 21:41)   письмо автору
 
   для: cheops   (08.09.2005 в 13:14)
 

А понял спасибо! Кстати как совет могу прдложить использовать ещё LIMIT 1 поскольку насколько я понимаю при этом если MySQL найдет одну запись, то дальше он искать не будет?
SELECT url FROM tbl WHERE sid = $sid AND time = '$time' LIMIT 1

   
 
 автор: cheops   (09.09.2005 в 01:24)   письмо автору
 
   для: Евгений Петров   (08.09.2005 в 21:41)
 

Да, это будет не лишним LIMIT здорово снижает нагрузку с сервера.

   
 
 автор: cheops   (25.08.2005 в 22:37)   письмо автору
 
   для: Евгений Петров   (25.08.2005 в 16:59)
 

SELECT url,MIN(time) FROM counter GROUP BY sid

Добавьте ещё сортировку по времени
SELECT url,MIN(time) FROM counter GROUP BY sid ORDER BY time DESC

   
 
 автор: Евгений Петров   (25.08.2005 в 22:43)   письмо автору
 
   для: cheops   (25.08.2005 в 22:37)
 

А зачем вроде то же самое выводит?

   
 
 автор: Евгений Петров   (25.08.2005 в 19:55)   письмо автору
 
   для: Евгений Петров   (25.08.2005 в 15:24)
 



Небольшая поправка. Как проделать то же самое со следующей таблицей:
+-------------------------------+
|            host               |
+-------------------------------+
| http://url1.ru                |
| http://url1.ru/index.php?id=2 |
| http://url2.ru/index.php?id=1 |
| www.url2.ru/index.php?id=2    |
| url2.ru/index.php?id=2        |
+-------------------------------+


Вывести должен то же самое.

В связи с тем, что я тут уже кучу дописал, то на этот пост можно не отвечать, буду просто следить за тем, чтобы данные в БД заносились в формате http://url.ru/?parametrs :)

   
 
 автор: cheops   (25.08.2005 в 22:33)   письмо автору
 
   для: Евгений Петров   (25.08.2005 в 19:55)
 

А нет возможности пробежаться по таблице средствами PHP и исправить URL - т.е. добавить всем у кого нет протокола http://? Или проверять это при внесении данных в таблицу?

   
 
 автор: Евгений Петров   (25.08.2005 в 22:38)   письмо автору
 
   для: cheops   (25.08.2005 в 22:33)
 

Да я при занесении это буду делать. Тут проблем нет.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования