Консультация № 124152
21.02.2008, 05:29
0.00 руб.
0 6 6
Уважаемые эксперты, приведённым в приложении запросом я считаю колличество записей с уникальным ip и free равным нулю.

Мне нужно модифицировать данный запрос так, чтобы он возвращал так-же(т.е. сразу 2 значения) колличество уникальных ip с free равным единице.
Спасибо.

Приложение:
SELECT COUNT(DISTINCT `ip`) AS `num` FROM `lan` WHERE `free`=‘0‘

Обсуждение

Неизвестный
21.02.2008, 05:52
общий
это ответ
Здравствуйте, Миленин Александр!

select count(distinct(ip)) from lan where free=0 or (free=1) group by free

select count(distinct(ip)),free from lan where free=0 or (free=1) group by free
(кол-во и тип 0 или 1)
Неизвестный
21.02.2008, 06:39
общий
это ответ
Здравствуйте, Миленин Александр!
Для этого нужно:
SELECT 0 as prizn_free, COUNT(DISTINCT `ip`) AS `num` FROM `lan` WHERE `free`=‘0‘
union all
SELECT 1 as prizn_free, COUNT(DISTINCT `ip`) AS `num` FROM `lan` WHERE `free`=‘1‘
order by prizn_free
Это один из вариантов.

Удачи!
Неизвестный
21.02.2008, 08:52
общий
это ответ
Здравствуйте, Миленин Александр!
Присоединяюсь к ответу Raptor,
но только ко второй его части.
Первая часть ответа не подходит.
Итак:
select free as `type`, count(distinct(ip)) AS `num`
from lan where free=0 or free=1
group by free
Неизвестный
21.02.2008, 09:39
общий
это ответ
Здравствуйте, Миленин Александр!

Вообще нет особой разницы, что именно использовать - UNION или GROUP BY.
Только например с GROUP BY можно вернуть количество уникальных IP по всем free, которые имеются в таблице. Но если бы мне нужно было толко по двум значениям - я бы наверно воспользовался объединением.

Вот еще несколько вариантов:

- возвращаем количество уникальных IP по всем имеющимся значениям FREE (с сортировкой по FREE)

SELECT ‘free‘, COUNT(DISTINCT(‘ip‘)) AS ‘num‘
FROM ‘lan‘
GROUP BY ‘free‘
ORDER BY ‘free‘

- то же самое, только уже с условием по нужным FREE

SELECT ‘free‘, COUNT(DISTINCT(‘ip‘)) AS ‘num‘
FROM ‘lan‘
WHERE ‘free‘ IN (0, 1) -- тут перечисляем через запятую все нужные нам FREE
GROUP BY ‘free‘
ORDER BY ‘free‘

- с использованием объединения все аналогично ответу ESI, правда можно без ALL, так как значения FREE мы уже ставим уникальные. Но это уже как кому приятнее.

Удачи.
Неизвестный
21.02.2008, 10:31
общий
это ответ
Здравствуйте, Миленин Александр!Такой запрос можно модифицировать так:
SELECT COUNT(DISTINCT `ip`) AS `num` FROM `lan` WHERE `free`=‘0‘
UNION
SELECT COUNT(DISTINCT `ip`) AS `num` FROM `lan` WHERE `free`=‘1‘
Можно так:
select distinct ‘ip‘, count(*) from ‘lan‘
where `free`=‘0‘ or `free`=‘1‘
group by ‘ip‘
Неизвестный
25.02.2008, 21:25
общий
это ответ
Здравствуйте, Миленин Александр!

Смею предположить, что из одной записи более удобно получать результаты. А по сему вот:

SELECT COUNT(DISTINCT `ip`*`free`)-1 AS `numfree1`, COUNT(DISTINCT `ip`*(`free`-1))-1 AS `numfree0`FROM `lan` WHERE `free`=0 OR `free`=1

В первом столбце будет для free=1, во втором для free=0
Форма ответа