Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложная выборка из одной таблицы / 5 сообщений из 5, страница 1 из 1
08.05.2018, 15:48
    #39642085
robinbad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная выборка из одной таблицы
Есть таблица с 2 полями

tel - Телефон, base_name - Источник данных

+----------+----------++
+ tel + base_name+
+----------+----------++
+phone1 + base1 +
+phone2 + base2 +
+phone1 + base2 +
+phone3 + base1 +
+++++++++++++++

Нужно сделать выборку из таблицы такую, чтобы отобразились телефоны которые, есть в base1 но нет в других base (В данном случае base2)

Верным ответом в данном примере будет

++++++++
+ phone3 +
++++++++

так как только он есть в base1 и нет в base2


база содержит 200к строк и постоянно растет

так что вариант с NOT IN и подзапрос не подходят (работает ужастно медленно)

JOIN на туже самую таблицуу не додумался как написать так как ON возможен только на поле tel и возращает только общие для перечисляемых base телефоны

Придумал как сделать через GROUP_CONCAT и временную таблицу, но мне видится это решение неуклюзим из за like поиска по group_name

Текущее решение таково

==============================================
CREATE TEMPORARY TABLE group_select SELECT
table1.tel,
GROUP_CONCAT(
table1.base_name
) AS group_name
FROM
table1
WHERE
(
table1.base_name = 'base1'
OR table1.base_name = 'base2'
)
GROUP BY
table1.tel;

SELECT DISTINCT
(tel)
FROM
group_select
WHERE
group_name NOT LIKE '%base2%';

==============================================

Есть ли варианты сделать более оптимально?
...
Рейтинг: 0 / 0
08.05.2018, 20:00
    #39642188
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная выборка из одной таблицы
select tel
from table
group by tel
having sum(base != 'base1') = 0
...
Рейтинг: 0 / 0
10.05.2018, 11:33
    #39642534
robinbad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная выборка из одной таблицы
Akinaselect tel
from table
group by tel
having sum(base != 'base1') = 0


Все гениальное просто! Благодарю
...
Рейтинг: 0 / 0
10.05.2018, 17:17
    #39642821
robinbad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная выборка из одной таблицы
Akina,

С сожалением выяснил, что такой вариант конфликтует с условием Where. когда нужно исключить конкретный источник данных

Например

Код: sql
1.
2.
3.
4.
5.
select tel
from table
where base='base1'
group by tel
having sum(base = 'base2') = 0



В таком варианте выборка делается из тех записей где источник данных base1 и HAVEN уже "не видит" base2 в итогах запроса.

Так что тема остается актуальной для общего случая. Когда нужно выбрать определенный источник и исключить из него данные, которые повторяются в других base
...
Рейтинг: 0 / 0
11.05.2018, 07:24
    #39642995
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная выборка из одной таблицы
robinbadтакой вариант конфликтует с условием Where. когда нужно исключить конкретный источник данныхПонимания логики исходного запроса - ноль, соответственно и в исправленном её ровно столько же.

Если в таблице есть ТОЛЬКО записи с base IN ('base1','base2') - WHERE вообще лишён смысла, и его в запросе вообще не должно быть. Но если там есть другие значения (да хоть бы и NULL), то в запросе должно появиться ещё одно условие в секции HAVING:
Код: sql
1.
2.
3.
4.
5.
select tel
from table
group by tel
having sum(base = 'base2') = 0
   and sum(base = 'base1') > 0
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложная выборка из одной таблицы / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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