Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка разности набора данных из одной таблицы. / 4 сообщений из 4, страница 1 из 1
11.04.2014, 00:35:07
    #38611914
fe121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка разности набора данных из одной таблицы.
Доброго времени суток. Бьюсь над запросом, не могу осилить уже последние 5 часов. Глаз "замылился". Возможно не верно сформулировал заголовок. И так к сути проблемы - есть таблицы девайсов. Многие поля упущены за ненадобностью в разрезе задачи.
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `devices` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `project_id` int(11) DEFAULT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1',
  `country` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1142254 DEFAULT CHARSET=utf8;



Есть следующий набор данных:
Для наглядности взят малый их кусок.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
+---------+------------+--------+---------+
| id      | project_id | active | country |
+---------+------------+--------+---------+
|      31 |        124 |      0 | US      |
|      33 |        124 |      0 | US      |
|      34 |        124 |      0 | US      |
| 1032712 |        124 |      0 | UA      |
| 1058487 |        124 |      1 | RU      |
| 1058488 |        124 |      0 | UA      |
| 1058491 |        124 |      0 | IE      |
| 1058492 |        124 |      0 | IE      |
| 1058529 |        124 |      0 | RU      |
| 1058531 |        124 |      1 | IE      |
| 1142245 |        124 |      0 | IE      |
| 1142246 |        124 |      1 | IE      |
| 1142247 |        124 |      1 | IE      |
+---------+------------+--------+---------+

Какие-то девайсы активные, какие-то не активные.
Необходимо:
Получить только те страны(country) в которых нет активного девайся(active = 0) с его project_id.
Тоесть в итоге хотелось бы получить следующую выборку:

Код: plaintext
1.
2.
3.
4.
5.
6.
+------------+---------+---------------+
| project_id | country | country_device_count |
+------------+---------+---------------+
|        124 | US      |             3 | active = 0
|        124 | UA      |             2 | active = 0
+------------+---------+---------------+

Так же сделал другой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
	project_id,
	UPPER(country) as country,
	count(country) as country_count
FROM `devices`
WHERE country not like '' and active = 1 AND country IS NOT NULL AND project_id = 124
group by project_id,country  
ORDER BY country_count 


которым получил кол-во активных девайсов по определенному проекту, с определенной страной
Код: plaintext
1.
2.
3.
4.
5.
6.
+------------+---------+---------------+
| project_id | country | country_count |
+------------+---------+---------------+
|        124 | RU      |             1 | active = 1
|        124 | IE      |             3 | active = 1
+------------+---------+---------------+
и запрос которым получил кол-во неактивных девайсов по стране и по проекту
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT 
	orig.project_id,
	UPPER(orig.country) as country,
	COUNT(orig.country) as count,
	orig.active 
FROM `xtreme_push_device` as orig
WHERE orig.active = 0 AND orig.country NOT LIKE '' AND orig.country IS NOT NULL
GROUP BY orig.project_id,orig.country
ORDER BY orig.project_id


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
+------------+---------+-------+--------+
| project_id | country | count | active |
+------------+---------+-------+--------+
|        124 | US      |     3 |      0 |
|        124 | UA      |     2 |      0 |
|        124 | IE      |     3 |      0 |
|        124 | RU      |     1 |      0 |
+------------+---------+-------+--------+

В итоге нужно получить таблицу разности двух вышеперечисленных таблиц, пример которой показан во второй таблице этого топика.
Если не трудно прошу помочь, самого переклинило.
Заранее спасибо.
...
Рейтинг: 0 / 0
11.04.2014, 06:38:03
    #38611951
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка разности набора данных из одной таблицы.
fe121Получить только те страны(country) в которых нет активного девайся(active = 0) с его project_id.
Тоесть в итоге хотелось бы получить следующую выборку:
Код: sql
1.
2.
3.
4.
5.
6.
select project_id, country
, count(*) as cdc
from table
where projectid=:someproject
group by 1,2
having max(active)=0


fe121В итоге нужно получить таблицу разности двух вышеперечисленных таблиц, пример которой показан во второй таблице этого топика.Стоп-стоп-стоп.
Во второй таблице выбираются страны, в которых нет ни одного активного девайса.
А тут вы хотите считать какую-то разность, учитывающую страны, в которых есть активные девайсы.
Либо вы путаетесь в показаниях, либо я чего-то не понял.
...
Рейтинг: 0 / 0
11.04.2014, 09:56:25
    #38612030
fe121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка разности набора данных из одной таблицы.
tanglir
Код: sql
1.
2.
3.
4.
5.
6.
select project_id, country
, count(*) as cdc
from table
where projectid=:someproject
group by 1,2
having max(active)=0




tanglir, здесь выборка происходит по конкретному проекту я я так понимаю.
а мне нужно по всем проектам:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
+------------+---------+---------------+
| project_id | country | country_device_count |
+------------+---------+---------------+
|         124  | US      |             3 | active = 0
|        124 | UA      |             2 | active = 0
|         156  | DE      |             2 | active = 0
|        156 | RU      |             3 | active = 0
|         178  | RU      |             1 | active = 0
+------------+---------+---------------+

tanglirА тут вы хотите считать какую-то разность, учитывающую страны, в которых есть активные девайсы.
Либо вы путаетесь в показаниях, либо я чего-то не понял.

Есть набор девайсов. Девайсы привязаны к какому-то проекту.Девайс может быть активен или не активен. Мне нужно получить все страны, по всем проектам в которых есть неактивные девайсы. Проблема в том что для одной страны могут быть и активные и неактивные девайсы. Так вот из выборки стран неактивных девайсов необходимо исключить те страны в которых есть активные девайсы. в качестве примера:
Здесь мы видим что на 124 проект для стран RU, IE зарегеистрированы 1,3 активных девайса для каждой.
Код: plaintext
1.
2.
3.
4.
5.
6.
+------------+---------+---------------+
| project_id | country | country_count |
+------------+---------+---------------+
|        124 | RU      |             1 | active = 1
|        124 | IE      |             3 | active = 1
+------------+---------+---------------+
Здесь мы видим что на 124 проекте, для страны US 3 неактивных девайся, для UA 2, IE - 3, RU -1.
Проблема в том что IE и RU есть в выборке активных девайсов, которая показана выше.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
+------------+---------+-------+--------+
| project_id | country | count | active |
+------------+---------+-------+--------+
|        124 | US      |     3 |      0 |
|        124 | UA      |     2 |      0 |
|        124 | IE      |     3 |      0 |
|        124 | RU      |     1 |      0 |
+------------+---------+-------+--------+
...
Рейтинг: 0 / 0
11.04.2014, 10:05:56
    #38612044
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка разности набора данных из одной таблицы.
fe121а мне нужно по всем проектам:ну уберите одну строчку из запроса...
fe121Есть набор девайсов. Девайсы привязаны к какому-то проекту.Девайс может быть активен или не активен. Мне нужно получить все страны, по всем проектам в которых есть неактивные девайсы . Проблема в том что для одной страны могут быть и активные и неактивные девайсы. Так вот из выборки стран неактивных девайсов необходимо исключить те страны в которых есть активные девайсы .В стране А есть один активный девайс проекта №1 и два неактивных девайса проекта №2. Запись "Страна А - проект №2 - 2 щтука" должна попасть в результат или нет?
Если да, то мой запрос - то, что вам нужно.
Если нет (надо исключить из результата страны, где есть хотя бы один активный девайс хотя бы по одному из проектов ) - добавить в запрос левый антиджойн с
Код: sql
1.
2.
3.
4.
select country
from table
group by 1
having max(active)=1
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка разности набора данных из одной таблицы. / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]