|
|
|
| Есть таблица
---------------------------------
| 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 |
---------------
|
| |
|
|
|
|
|
|
|
для: Евгений Петров
(24.08.2005 в 19:36)
| | Нет с регуярными выражениями не получится... нет подходящей режущей функции... следует обходиться строковыми функциями
SELECT SUBSTRING_INDEX(host, '/', 3) AS total, COUNT(SUBSTRING_INDEX(host, '/', 3)) FROM tbl GROUP BY total
|
| |
|
|
|
|
|
|
|
для: cheops
(24.08.2005 в 20:27)
| | Огромное спасибо, ещё раз убедился в "могучести" языка SQL. :) | |
|
|
|
|
|
|
|
для: Евгений Петров
(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 в 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 в 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 с других строк? | |
|
|
|
|
|
|
|
для: Евгений Петров
(25.08.2005 в 19:53)
| | Потому что группировка по sid проводится. | |
|
|
|
|
|
|
|
для: cheops
(25.08.2005 в 22:38)
| | А как сделать чтоб выводилось то что надо? | |
|
|
|
|
|
|
|
для: Евгений Петров
(25.08.2005 в 22:43)
| | Если требуется группировка по sid в один запрос может не получиться... | |
|
|
|
|
|
|
|
для: cheops
(25.08.2005 в 23:59)
| | Надо чтобы вывелось то же самое, только, чтоб url были из тех строк из которых и выведенное время | |
|
|
|
|
|
|
|
для: Евгений Петров
(26.08.2005 в 00:01)
| | Нет в один запрос не получится придётся выбирать уникальные sid - число, а потом в цикле по уникальным sid организовывать дополнительные запросы на выборку URL и времени. | |
|
|
|
|
|
|
|
для: cheops
(26.08.2005 в 13:10)
| | А разве запрос может выбрать из базы данные из разных строк? | |
|
|
|
|
|
|
|
для: Евгений Петров
(27.08.2005 в 15:32)
| | Если честно то не очень понял вопрос :))) | |
|
|
|
|
|
|
|
для: 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 тоже в разных строках. | |
|
|
|
|
|
|
|
для: Евгений Петров
(27.08.2005 в 21:33)
| | Когда используется GROUP BY, т.е. url берётся от фонаря какой ближе, и агрегатная функция по другому столбцу (MIN, MAX), к сожалению, это возможно. MIN() и MAX() возвращают минимальное и максимальное значения в пределах группы образованной GROUP BY - поэтому в этом случае чаще прибегают к циклу. | |
|
|
|
|
|
|
|
для: cheops
(28.08.2005 в 11:41)
| | Ясно спасибо. | |
|
|
|
|
|
|
|
для: Евгений Петров
(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. Заранее большое спасибо! | |
|
|
|
|
|
|
|
для: Евгений Петров
(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'
|
| |
|
|
|
|
|
|
|
для: cheops
(08.09.2005 в 13:14)
| | А понял спасибо! Кстати как совет могу прдложить использовать ещё LIMIT 1 поскольку насколько я понимаю при этом если MySQL найдет одну запись, то дальше он искать не будет?
SELECT url FROM tbl WHERE sid = $sid AND time = '$time' LIMIT 1
|
| |
|
|
|
|
|
|
|
для: Евгений Петров
(08.09.2005 в 21:41)
| | Да, это будет не лишним LIMIT здорово снижает нагрузку с сервера. | |
|
|
|
|
|
|
|
для: Евгений Петров
(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
|
| |
|
|
|
|
|
|
|
для: cheops
(25.08.2005 в 22:37)
| | А зачем вроде то же самое выводит? | |
|
|
|
|
|
|
|
для: Евгений Петров
(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 :) | |
|
|
|
|
|
|
|
для: Евгений Петров
(25.08.2005 в 19:55)
| | А нет возможности пробежаться по таблице средствами PHP и исправить URL - т.е. добавить всем у кого нет протокола http://? Или проверять это при внесении данных в таблицу? | |
|
|
|
|
|
|
|
для: cheops
(25.08.2005 в 22:33)
| | Да я при занесении это буду делать. Тут проблем нет. | |
|
|
|