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

start [/forum/topic.php?fid=47&msg=39642188&tid=1829861]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
42ms |
get tp. blocked users: |
2ms |
| others: | 14ms |
| total: | 150ms |

| 0 / 0 |
