Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
08.05.2018, 15:48
|
|||
|---|---|---|---|
|
|||
Сложная выборка из одной таблицы |
|||
|
#18+
Есть таблица с 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%'; ============================================== Есть ли варианты сделать более оптимально? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
08.05.2018, 20:00
|
|||
|---|---|---|---|
Сложная выборка из одной таблицы |
|||
|
#18+
select tel from table group by tel having sum(base != 'base1') = 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.05.2018, 11:33
|
|||
|---|---|---|---|
|
|||
Сложная выборка из одной таблицы |
|||
|
#18+
Akinaselect tel from table group by tel having sum(base != 'base1') = 0 Все гениальное просто! Благодарю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.05.2018, 17:17
|
|||
|---|---|---|---|
|
|||
Сложная выборка из одной таблицы |
|||
|
#18+
Akina, С сожалением выяснил, что такой вариант конфликтует с условием Where. когда нужно исключить конкретный источник данных Например Код: sql 1. 2. 3. 4. 5. В таком варианте выборка делается из тех записей где источник данных base1 и HAVEN уже "не видит" base2 в итогах запроса. Так что тема остается актуальной для общего случая. Когда нужно выбрать определенный источник и исключить из него данные, которые повторяются в других base ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.05.2018, 07:24
|
|||
|---|---|---|---|
Сложная выборка из одной таблицы |
|||
|
#18+
robinbadтакой вариант конфликтует с условием Where. когда нужно исключить конкретный источник данныхПонимания логики исходного запроса - ноль, соответственно и в исправленном её ровно столько же. Если в таблице есть ТОЛЬКО записи с base IN ('base1','base2') - WHERE вообще лишён смысла, и его в запросе вообще не должно быть. Но если там есть другие значения (да хоть бы и NULL), то в запросе должно появиться ещё одно условие в секции HAVING: Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=47&mobile=1&tid=1829861]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
23ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 122ms |

| 0 / 0 |
