|
|
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
Имеется два запроса: 1-ый запрос - извлекает из базы список всех когда-либо зарегистрированных пользователей (активных, не заблокированных), 2-ой запрос - извлекает из базы список пользователей (активных, не заблокированных), которые хотя что-то когда-либо бронировали (отель, автомобиль и т.д.) Задача: нужно написать третий запрос (или как-то доработать существующие), который бы позволил извлечь из первых двух запросов пользователей, которые никогда не выполняли бронирование. Подскажите, как можно реализовать? 1-ый запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 2-ой запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 11:15 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovпользователей, которые никогда не выполняли бронированиеleft join + is null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 11:19 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
А почему нужно писать третий запрос обязательно на основе первых двух, а не самостоятельный запорс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 11:23 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
Akina, Можно и самостоятельный запрос, не принципиально. Просто давно хотелось попробовать (но не предоставлялось случая) поработать с "разностью множеств". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 11:55 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsov, not [IN | EXISTS] подзапрос, либо семи-джойн анти (left join + where is null) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 11:58 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovдавно хотелось попробовать (но не предоставлялось случая) поработать с "разностью множеств".Методика дана: tanglirleft join + is null Пробуй. okuznetsovМожно и самостоятельный запрос, не принципиально. Ну если производительность по барабану, то да... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 11:59 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovИмеется два запроса: 1-ый запрос - извлекает из базы список всех когда-либо зарегистрированных пользователей (активных, не заблокированных), 2-ой запрос - извлекает из базы список пользователей (активных, не заблокированных), которые хотя что-то когда-либо бронировали (отель, автомобиль и т.д.) Задача: нужно написать третий запрос (или как-то доработать существующие), который бы позволил извлечь из первых двух запросов пользователей, которые никогда не выполняли бронирование. Подскажите, как можно реализовать? Кореллированый подзапрос с NOT EXISTS. Второй твой запрос нужно сделать подзапросом к первому, введя его через NOT EXISTS, и скоррелировав по идентификаторам пользователя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 12:40 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
Вроде бы верно написал, но запрос не правильно работает, получаю одну запись с id=1 (соответственно так не должно быть, записей в базе в достаточном кол-ве). Соответственно где-то я накосячил Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 13:59 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsov, Ты где такой синтаксис exists выискал? Посмотри примеры, сравни с тем, что у тебя, почувствуй разницу.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 14:31 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsov Код: sql 1. В такой конструкции EXISTS неприменимо, только ALL | ANY | SOME. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 14:35 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
Я пробовал разные варианты использования Exist, вот последняя. Если использовать not exist, то селект выдаёт пустоту. А в данном контексте, селект выдаёт такую же выдачу, что если бы я не закомментировал exist и не использовал, в общем не отрабатывает ехist. На рисунке во вкладке "Result1" - это то что выдаёт данный селект, и эта выдача полностью повторяет выдачу без использования конструкции exist. Во вкладке "Result2" - это то что выдаётся в конструкции exist. В общем итоговой выдаче согласно Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 15:18 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
отправил сообщение, не дописал. В общем в результирующем запросе должны быть те записи которые не присутствуют в выдаче см. рис. на вкладке "Result2", т.е это наример - 10, 17,21, 23. Конструкция not exist должна мне позволить это и сделать, я правильно понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 15:23 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 15:48 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
Тогда что-то пошло не так. Возможно чего-то ещё не хватает в запросе. Попробовал добавить join (отметил желтым). Теперь выдача дублирует выдачу см. рис. на вкладке "Result2", но с более расширенными данными соответственно. Вроде бы всё нормально, так и должно бы быть, добавляю к exist - NOT, в результате опять выдача пустая, а не должна была быть пустой. Что-то не отрабатывает, не могу понят что именно Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 15:58 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsov, направьте ещё раз в нужную сторону с exist? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2016, 10:39 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
Пока забросил exist. Решил сделать как многие советовали через LEFT JOIN и IS NULL Код: sql 1. 2. 3. 4. 5. не уверен, что сделал правильно, т.к. запрос долго выполняется (ни разу не дождался до конца). в bookingsHistory около 600 000 строк. Код: sql 1. 2. 3. 4. 5. id Select_type table type rows Extra 1 SIMPLE A ALL 5146 1 SIMPLE B ALL 550486 Using where; Not exists ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2016, 18:45 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsov, тихо сам с собою? тебе все сказано уже, только SQL осталось выучить, изобрести машину времени, вернуться назад к моменту получения тобой последних ЦУ в этом топике и написать запрос за 5 минут... Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2016, 20:18 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Последовал вашим советам, кроме изобретения машины времени и возвращению назад к моменту получения мною последних ЦУ. Решил продолжить со своих ЦУ (где тихо сам с собою общался:-)) - http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1216601&msg=19264524 В общем получилось следующее (скорее всего запрос можно ускорить, на данный момент выкладываю то что получилось и правильно работает): SELECT a.id as agenciesId, a.name as agenciesName, CONCAT('http://online-express.ru/office/agencies/',a.id) AS urlAgency, count(u.id) as agenciesNumberLoginov, FROM_UNIXTIME(a.createTime) as agenciesCreateTime, FROM_UNIXTIME(a.updateTime) as agenciesUpdateTime, a.enabled as agenciesEnabled, u.activated userActivated, u.enabled as usersEnabled FROM users u LEFT JOIN bookingsHistory b ON u.id = b.userId INNER JOIN agencies a ON (u.agencyId = a.id) WHERE b.userId IS NULL AND u.activated = 1 AND u.enabled = 1 AND a.enabled = 1 GROUP BY agenciesId, agenciesName ORDER BY agenciesCreateTime DESC В общем нужно было создать индекс, чтобы запрос из моего предыдущего топика нормально выполнился. alter table bookingsHistory add index(userId); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2016, 18:36 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39248886&tid=1831686]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
155ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
| others: | 254ms |
| total: | 517ms |

| 0 / 0 |
