DISTINCT

Статус
Закрыто для дальнейших ответов.

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Всем привет!
Таблица: [id], [ip],[browser],[data]
Как вывести данные из таблицы, но что бы стобец [ip] и [brpwser] были уникальными?
Поясняю, хочу вывести ip и браузер людей находящихся на сайте, но при этом что бы выводилась и дата.. Сперва делал так:
Код:
$_onl = mysql_query("SELECT DISTINCT `ip`,`browser` FROM `online` WHERE `data` > NOW() - INTERVAL '5' MINUTE");
Но тут нет даты, поэтому я не могу высчитать время, которое человек находится на сайте...
Тогда я попробовал так:
Код:
$_onl = mysql_query("SELECT DISTINCT `ip`,`browser`,`data` FROM `online` WHERE `data` > NOW() - INTERVAL '5' MINUTE");
А теперь у меня выводит все ip и browser в бд по уникальной дате... бррр...
Может как то можно сделать по другому?
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Сделай GROUP BY `ip`. Он сгруппирует записи по ip.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Помогите сформировать запрос? Таблица: [id] [prosmotr] [privat] [data]
Вот ниже запросы, можно ли их как то в один или хотя бы в два преобразовать?
Код:
//Подсчитываем сумму столбца просмотров (общее колличество просмотров)
SELECT sum( `prosmotr` ) FROM `tbl`;
//Подсчитываем общее колличество приватных файлов, 1 - приватные файлы, 0 - не приватные
SELECT count( * )  FROM `tbl` WHERE (`privat` = '1');
//Подсчитываем общее колличество НЕ приватных файлов
SELECT count( * )  FROM `tbl` WHERE (`privat` = '0');
//Подсчитываем сколько всего файлов в таблице
SELECT count( * )  FROM `tbl`
//Подсчитываем сколько загрузили файлов за последние 7 дней
SELECT count( * )  FROM `tbl` WHERE `data`> NOW() - INTERVAL '7' DAY;
Специально поставил комменты, что бы было более понятно..
 

marker

Well-Known Member
Регистрация
23.10.2010
Сообщения
399
Я пока только придумал убрать 1 запрос.

Код:
//Подсчитываем сумму столбца просмотров (общее колличество просмотров)
SELECT sum( `prosmotr` ) FROM `tbl`;
//Подсчитываем общее колличество приватных файлов, 1 - приватные файлы, 0 - не приватные
SELECT count( * )  FROM `tbl` WHERE (`privat` = '1');
//Подсчитываем сколько всего файлов в таблице
SELECT count( * )  FROM `tbl`
//Подсчитываем сколько загрузили файлов за последние 7 дней
SELECT count( * )  FROM `tbl` WHERE `data`> NOW() - INTERVAL '7' DAY;
Чтобы подсчитать общее количество НЕ приватных файлов, достаточно вычесть из кол. всех файлов кол. приватных.

И скорее всего можно объединить 2 запроса, еще правда так не пробовал.

Код:
//Подсчитываем общее колличество приватных файлов, 1 - приватные файлы, 0 - не приватные
SELECT count( * )  FROM `tbl` WHERE (`privat` = '1');
//Подсчитываем сколько всего файлов в таблице и сумму просмотров
SELECT count( * ), sum( `prosmotr` )  FROM `tbl`
//Подсчитываем сколько загрузили файлов за последние 7 дней
SELECT count( * )  FROM `tbl` WHERE `data`> NOW() - INTERVAL '7' DAY;
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
И скорее всего можно объединить 2 запроса, еще правда так не пробовал.
Работает нормально:)
Всегда забываю спросить: Что означает звездочка в count(*)? Пробовал вместо нее подставлять названия столбцов, результат вывода не меняется, одно и тоже число записей..

Всё, я нашел решение как все 5 запросов уместить в :excl: одном запросе ;)
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Ты покажи как сделал-то;)
Я вот так сделал:
Код:
SELECT
COUNT(*) as `all`,
SUM(`privat`) as `private`,
COUNT(*) - SUM(`privat`) as `public_1`, -- Это один способ
SUM(ABS(`privat`-1)) as `public_2`, -- Это второй способ, мне кажется он лучше
SUM(`data`> NOW() - INTERVAL '7' DAY) as `week_upload`,
SUM(`prosmotr`) as `views`
FROM `tbl`
p.s. Я честно говоря точно не знаю(а лезть в ман лень ^__^ ) что значит COUNT(->>*<<-), но где-то читал что лучше использовать *, чем имя колонки - так быстрее.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Ты покажи как сделал-то;)
Я вот так сделал:
Код:
SELECT
COUNT(*) as `all`,
SUM(`privat`) as `private`,
COUNT(*) - SUM(`privat`) as `public_1`, -- Это один способ
SUM(ABS(`privat`-1)) as `public_2`, -- Это второй способ, мне кажется он лучше
SUM(`data`> NOW() - INTERVAL '7' DAY) as `week_upload`,
SUM(`prosmotr`) as `views`
FROM `tbl`
p.s. Я честно говоря точно не знаю(а лезть в ман лень ^__^ ) что значит COUNT(->>*<<-), но где-то читал что лучше использовать *, чем имя колонки - так быстрее.
Вот так:
Код:
SELECT count( CASE WHEN `privat` = '1' THEN 1 ELSE NULL END ) ,
count( CASE WHEN `privat` != '1' THEN 1 ELSE NULL END ) , 
count( CASE WHEN `data` > NOW( ) - INTERVAL '7' DAY THEN 1 ELSE NULL END ) , 
sum( `prosmotr` ) , 
count( * ) 
FROM `tbl`;
Только теперь другая проблема, названия столбцов получаются очень длинные... вот как выходит:
Код:
$_zapros=mysql_query("SELECT count( 
CASE WHEN `privat` = 1
THEN 1 
ELSE NULL 
END ) , count( 
CASE WHEN `privat` != '1'
THEN 1 
ELSE NULL 
END ) , count( 
CASE WHEN `data` > NOW( ) - INTERVAL '7'
DAY THEN 1 
ELSE NULL 
END ) , sum( `prosmotr` ) , count( * ) 
FROM `tbl`");
$_poisk2=mysql_fetch_assoc($_zapros);
echo 'Обычных файлов: '.$_poisk2["count( CASE WHEN `privat` != '1 THEN 1 ELSE NULL END )"].'<br> Приватных файлов: '.$_poisk2["count( CASE WHEN privat = 1 THEN 1 ELSE NULL END )"].'<br>Всего файлов: '.$_poisk2['count( * )'].'<br>Всего просмотров: '.$_poisk2['sum( `prosmotr` )'].'<br> За последние 7 дней: '.$_poisk2['count( CASE WHEN `data` > NOW( ) - INTERVAL '7' DAY THEN 1 ELSE NULL END )'];
Можно как то это избежать? Что бы вместо таких длинных столбцов писать коротко? Ниже скриншот
P.S что значит AS у Вас? Впервые вижу это:(
 

Вложения

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Почитал литературу, со всем разобрался по AS и DISTINCT... Но теперь сложнее проблема (для меня):(
3 таблицы
Попробую в кратце описать:
В перовй таблице название файла, приватное или нет, число просмотров и айди пользователя, который добавил файлик
Во второй таблице голосование к файлам, в поле id_m - ид файла из первой таблицы; логин пользователя, который поставил оценку и сама оценка (либо плюс, либо минус)
Третья таблица тут хранятся комменты к файлам, столбец id_file - это айди из первой таблиц; айди пользователя,добавившего коммент, и сам коммент...
Мне нужно вывести на страницу Название файла, Число просмотров к нему, общее число комментов к этому файлу и рейтинг плюсов и минусов по отдельности
(просто скопируйте в sql запрос и всё):
Код:
CREATE TABLE IF NOT EXISTS `table1` (
  `id` mediumint(9) NOT NULL auto_increment,
  `id_login` mediumint(9) NOT NULL,
  `data` datetime NOT NULL,
  `nazvanie` text NOT NULL,
  `prosmotr` mediumint(9) NOT NULL,
  `privat` tinyint(4) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `prosmotr` (`prosmotr`),
  KEY `privat` (`privat`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;
INSERT INTO `table1` (`id`, `id_login`, `data`, `nazvanie`, `prosmotr`, `privat`) VALUES
(1, 1, '2011-04-28 01:22:21', 'Первый файл', 10, 1),
(2, 1, '2011-04-29 01:22:08', 'Второй файд', 100, 1),
(3, 2, '2011-04-29 01:22:43', 'Третий файлик', 1545, 1),
(4, 2, '2011-04-29 01:22:53', 'А это четвертый', 500, 1);
CREATE TABLE IF NOT EXISTS `table2` (
  `id` mediumint(9) NOT NULL auto_increment,
  `login` text NOT NULL,
  `id_m` mediumint(9) NOT NULL,
  `minus` tinyint(4) NOT NULL,
  `plyus` tinyint(4) NOT NULL,
  `data` datetime NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `id_login` (`id_m`,`minus`,`plyus`),
  KEY `data` (`data`),
  FULLTEXT KEY `login` (`login`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;
INSERT INTO `table2` (`id`, `login`, `id_m`, `minus`, `plyus`, `data`) VALUES
(1, 'Вася', 1, 1, 0, '2011-04-29 01:24:27'),
(2, 'Саша', 1, 0, 1, '2011-04-29 01:24:48'),
(3, 'Петя', 1, 1, 0, '2011-04-29 01:25:20'),
(4, 'Наташа', 1, 0, 1, '2011-04-29 01:25:40');
CREATE TABLE IF NOT EXISTS `table3` (
  `id` mediumint(9) NOT NULL auto_increment,
  `id_file` mediumint(9) NOT NULL,
  `id_login` mediumint(9) NOT NULL,
  `komment` text NOT NULL,
  `data` datetime NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `id_file` (`id_file`,`id_login`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;
INSERT INTO `table3` (`id`, `id_file`, `id_login`, `komment`, `data`) VALUES
(1, 1, 10, 'Не нужный файл!', '2011-04-29 01:26:46'),
(2, 1, 11, 'Хороший файл!', '2011-04-29 01:27:03'),
(3, 1, 5, 'Фигня!', '2011-04-29 01:26:46'),
(4, 1, 3, 'Привет всем!', '2011-04-29 01:27:03');
Вот запрос к ним, он работает, но не правильно:( Не праильно постоянно подсчитывает число строк, сумму минусов и плюсов, но хоть что то выводит(((
Код:
SELECT `table1`.`id` , `table1`.`privat` , `table1`.`prosmotr` , `table1`.`id_login` , `table1`.`nazvanie` , `table1`.`data` , COUNT( `table3`.`id` ) , SUM( `table2`.`minus` ) , SUM( `table2`.`plyus` ) 
FROM `table1` 
LEFT JOIN `table3` ON `table1`.`id` = `table3`.`id_file` 
LEFT JOIN `table2` ON `table1`.`id` = `table2`.`id_m` 
GROUP BY `table1`.`id` , `table2`.`id_m` 
LIMIT 0 , 30
Помогите :rolleyes: :rolleyes: Иначе я не знаю как ещё сделать, что бы не было запросов в цикле, для меня это сложно((( Для хорошо знающего sql думаю это 15 минут хватит :eek:hmy:

Спасибо всем, кто помог мне с этим запросом в три таблицы, а значит никому! Сделал второй запрос внутри цикла...
Подумаешь на странице показывают 10 файлов, это 10 лишних запросов к каждому файлу, с 10 пользователей это уже 100 за каждые обновления страниц, а страниц там много, 100 страниц это 10000 лишних запросов, норм) примерно за час, итого за сутки 240000 запросов) :huh:
 
Статус
Закрыто для дальнейших ответов.
Верх Низ