|
|
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
Всем хорошего настроения :) Дано: Есть пользователи, они имеют различные сертификаты. Есть задачи, которые тоже имеют список необходимых для выполнения сертификатов. Нужно найти ВСЕХ пользователей которые могут выполнить задачу (имеют ВСЕ сертификаты, которые требуются в задаче) Данные: Есть пользователи, есть сертификаты. они связаны многие-ко-многим. Есть задачи. Задача связана с сертификатами многие-ко-многим. Требуется: найти ВСЕХ пользователей у которых есть ВСЕ сертификаты связанные с задачей. если у задачи нет сертификатов - ее может выполнить любой. Как сделать пока не понял :( Можно сделать на app сервере, но хочется на СУБД, чтобы не тянуть огромные пакеты данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 14:28 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
А если перевормулировать так: выбрать всех ползователей для которых нет такого сертификата который есть у задачи но нет у пользователя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 15:49 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
VoDA DDL таблиц приведите - напишу решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 15:58 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
VoDAКак сделать пока не понял :( Если тупо в лоб: "количество сертификатов, связывающих пользователя с задачей, равняется количеству сертификатов в задаче". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 17:05 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов DDL таблиц приведите - напишу решение. PostgreSQL Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. Задача немного усложняется тем, что сертификаты имеют уровни. Уровень у человека должен быть больше, чем у задачи. НО можно решить и без этого... дальше сам дойду :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 17:06 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
softwarer VoDAКак сделать пока не понял :( Если тупо в лоб: "количество сертификатов, связывающих пользователя с задачей, равняется количеству сертификатов в задаче". Молодец :) Я сам так же сделал... но сам запрос получается уж очень не эстетичным что-ли, потому спрашиваю помощи всемогущего All ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 17:09 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
VoDAМолодец :) Давай пирожок. VoDAЯ сам так же сделал... но сам запрос получается уж очень не эстетичным что-ли Задумался, как написать его так, чтобы получилось неэстетично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 17:29 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. employer это работодатель, а не работник А на количество их нельзя сравнивать - т.к. они не взаимозаменяемые ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 18:03 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
beluginА на количество их нельзя сравнивать - т.к. они не взаимозаменяемые Поподробнее, пожалуйста. Если сильно хотите, согласен уточнить формулировку до "количество уникальных сертификатов". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 18:05 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
eЕсли сильно хотите, согласен уточнить формулировку до "количество уникальных сертификатов". допустим для рещения задачи нужен человек, имеющий хотя бы 1 сертификат по MS SQL Server в наличии имеется Иванов у которого 1 сертификат по макраме - подойдет ли он для этой задачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2007, 00:33 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
VoDAPostgreSQL С этим не работал. Во-первых, в Вашем случае стоило бы наложить уникальность по паре идентификатров в таблицах связи. Во-вторых, случай, что у задачи нет сертификатов, сделаете сами. В-третьих: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. Сильно ошибиться в синтаксисе не должен был. Вариант 1 по ряду причин мне кажется предпочительнее, работать он должен быстрее. Но в варианте 2 можно предрассчитать последний агрегат. Там же под count специально сделал 2 разных аргумента, чтобы Вы обратили на это внимание, что стоит сделать "во-первых". В варианте 1 exists нужен для облегчения выполнения запроса, чтобы куда более сложный второй подзапрос лишний раз не гонять, такой же exists можно добавить и во 2-й вариант. В варианте 1 можно избавиться от distinct и заменить employer_certificates ec на employer e, здесь просто показана логика, что если у одного человека в среднем не сильно много сертификатов и людей много, то получится выигрыш в исключении employer e. Тем не менее, вариант 3 без distinct: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 3-й вариант вроде бы можно переписать без самого внутреннего not exists через join, попробуйте сами это сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2007, 10:52 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
beluginemployer это работодатель, а не работник А на количество их нельзя сравнивать - т.к. они не взаимозаменяемые а employee - это работник, а не работодатель ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2007, 11:01 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов where exists(select 1 авторесли у задачи нет сертификатов - ее может выполнить любой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2007, 11:02 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
belugin Читаем еще раз 1-й пост и мое сообщение целиком и внимательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2007, 11:03 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов belugin Читаем еще раз 1-й пост и мое сообщение целиком и внимательно. Извиняюсь, пропустил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2007, 11:17 |
|
||
|
Вопрос по сложной выборке
|
|||
|---|---|---|---|
|
#18+
Спасибо всем, кто принял участие. Было решено сделать на уровне апп-сервера - через работу со списками и их пересечением. Критериев почему именно так - много :) сам SQL (который был получен, но не используется сейчас): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2007, 12:14 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34731937&tid=1544350]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
228ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 565ms |

| 0 / 0 |
