|
|
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
Всем здравствуйте! Есть следующая задачка - нужно в конструкции in() селекта подзапроса использовать значение поля, представленного в виде перечня неких чисел. А поскольку в in() нужно перечислить через запятую значения или воспользоваться подзапросом, - то мне нужно каким то образом преобразовать значение поля вида ("111,222,333") в in(111, 222, 333) или in(... таблица-последовательность этих чисел ...) Мой упрощенный запрос select "ттп".* from "таблица товаров приходов" "ттп" where 1 and "ттп"."тип товара" = "запчасть" and ("ттп".count) <> ( select sum(count) from "таблица товаров приходов" /* т.е. из этой же таблицы */ where 1 and "код прихода" = "ттп"."код прихода" and "ттп"."тип товара" <> "запчасть" and "ттп"."код товара" in(/*сдесь собираюсь использовать значение поля запчасти "ттз"."перечень кодов товаров" таблицы main_table вида ("111,222,333", "222,111", "555", null и т.п.)*/) ) Т.е., таблица "таблица товаров приходов" хранит товары и запчасти. Смысл запроса - вывести все запчасти, количество которых "count" не равно сумме остальных типов товаров данной таблицы, но в пределах каждого конкретного прихода. Прочитал в разных статьях, что нативной функции для разбивки строки по разделителю не существует. Нашел пример хран. проц. аналога PHP explode() И что вернуть таблицу можно тоже только из хран. процедуры. Я в них новичок, и пока смог "придумать" только такую: Код: sql 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. Этот код полностью работает. Пока я понимаю так, что смогу использовать возвращаемую из хр. проц. таблицу в конструкции in() . Проблема в том, что не получается сделать работающий запрос. Пытался делать по примеру данной статьи http://citforum.ru/database/sql_any/sql_062.shtml Но запутался, когда дошло дело до таблицы CURSOR. Согласно статье, в хр. процедуре нужно не только создать селект, но и в операторе RESULT перечислить поля возвращаемой таблицы. На данном этапе (с RESULT) я получаю ошибку "Error in query (1064): Syntax error near '(`part` LONG VARCHAR) BEGIN drop table if exists `xxxx`; create t' at line 3", далее по статье продвинуться не могу. Также не нашел что означает конструкция "body:", но ни с ней, ни без нее не работатает без ошибки. Т.е., хранимая процедура explode на данный момент ошибок не выдает, пока не раскомментирую RESULT ... Пока мыслей больше нет, нужна помощь ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2016, 18:02 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
bannndiПока я понимаю так, что смогу использовать возвращаемую из хр. проц. таблицу в конструкции in() .Нет, в MySQL так нельзя. bannndiв операторе RESULT перечислить поля возвращаемой таблицы.в MySQL нет такой конструкции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2016, 19:18 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
miksoftbannndiПока я понимаю так, что смогу использовать возвращаемую из хр. проц. таблицу в конструкции in() .Нет, в MySQL так нельзя. bannndiв операторе RESULT перечислить поля возвращаемой таблицы.в MySQL нет такой конструкции. Обескуражен. И придумать совсем ничего нельзя? Учитывая условия задачи, конечно. Я еще держу про запас план с отдельной таблицей "многие ко многим" для хранения связей конкретных позиций приходов с запчастями, но так хотелось обойтись без нее. Редактироваться это поле не будет, так что было бы удобно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 10:52 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
bannndi, скидывай числа в табличку, будет в сто раз проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 10:59 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
Можно использовать prepared statement. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 11:35 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
AkinaМожно использовать prepared statement. Akina, приведите пример, пожалуйста. Я использую PDO и подготовленные запросы, но пока не сталкивался с тем, чтобы хоть както можно было строку вида "111,222,333" превратить в аргумент для in(111,222,333) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 11:49 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
Предположим, в хранимой процедуре я всеже буду удалять и создавать временную таблицу, в которую буду инсертить 111, 222, 333. Тогда мне непонятно, как или где в селекте вызывать данную процедуру так, чтобы в in(я мог написать так: select part from temp_table). Копия селекта из первого поста Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. По моей логике, процедура должна вызываться в самом селекте, чтобы временная таблица пересоздавалась для каждого товара (не запчасти), но где именно можно и нужно ее вызывать - не ясно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 12:17 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
bannndiстроку вида "111,222,333" превратить в аргумент для in(111,222,333) Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 13:43 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
bannndiПредположим, в хранимой процедуре я всеже буду удалять и создавать временную таблицу, в которую буду инсертить 111, 222, 333. Тогда мне непонятно, как или где в селекте вызывать данную процедуру так, чтобы в in(я мог написать так: select part from temp_table). Тебе не надо удалять и создавать таблицы. Создай таблицу один раз. В PK добавь SPID или как он там у нас называется. Идентификатор сеанса. И набивай для данного сеанса туда данные. Когда не нужны -- удаляй. Перед тем, как набить, тоже удаляй на всякий случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 14:42 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
результат из хранимки можно вернуть в виде строки через входной параметр с атрибутом in/out. дальше использовать в операторе in ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 14:52 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
MasterZivbannndiПредположим, в хранимой процедуре я всеже буду удалять и создавать временную таблицу, в которую буду инсертить 111, 222, 333. Тогда мне непонятно, как или где в селекте вызывать данную процедуру так, чтобы в in(я мог написать так: select part from temp_table). Тебе не надо удалять и создавать таблицы. Создай таблицу один раз. В PK добавь SPID или как он там у нас называется. Идентификатор сеанса. И набивай для данного сеанса туда данные. Когда не нужны -- удаляй. Перед тем, как набить, тоже удаляй на всякий случай. Что такое PK? ) Гугл не подсказал. По поводу SPID тоже сомнения, видимо мои знания MySQL недостаточно глубоки. На уровне сессий пока не особо разбираюсь. Если не трудно, MasterZiv, то может покажете пример всей последовательности действий, а главное - использование в подзапросе селекта. Заранее благодарен. Может поможете если не мне, то кому то другому интересующемуся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 15:10 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
bannndiЧто такое PK? ) Гугл не подсказал. Primary Key ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 15:10 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
вадярезультат из хранимки можно вернуть в виде строки через входной параметр с атрибутом in/out. дальше использовать в операторе in вадя, наверное, только непонятно как это можно использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 15:11 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
AkinabannndiЧто такое PK? ) Гугл не подсказал. Primary Key Тогда подсказал, а я просто не поверил ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 15:12 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
На другом форуме мне подсказали отличное решение, но ради "спортивного интереса", пока ответ не буду сообщать здесь. Вдруг найдутся и другие решения. ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 15:21 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
bannndiНа другом форуме мне подсказали отличное решение, но ради "спортивного интереса", пока ответ не буду сообщать здесь.Могу предположить, что подсказали функцию FIND_IN_SET. Если использование индексов не требуется, то да, решение подходящее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 15:31 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
miksoftbannndiНа другом форуме мне подсказали отличное решение, но ради "спортивного интереса", пока ответ не буду сообщать здесь.Могу предположить, что подсказали функцию FIND_IN_SET. Если использование индексов не требуется, то да, решение подходящее. miksoft, правильно! ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 16:01 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
bannndi , ох, не использовал бы ты этот костыль в качестве решения... всё-таки парсинг в temporary table предпочтительнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 16:29 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
Код: sql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 18:36 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
bannndiвадярезультат из хранимки можно вернуть в виде строки через входной параметр с атрибутом in/out. дальше использовать в операторе in вадя, наверное, только непонятно как это можно использовать. в prepared statement, пример уже привели ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 18:56 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
MasterZiv Код: sql 1. 2. MasterZiv, спасибо за потраченное время, пример познавательный! Одно мне непонятно. Каким образом будет вызываться данная процедура множество раз в подзапросе подсчета суммы количеств товаров с этой запчастью? Я ведь пытаюсь одним запросом вернуть весь нужный мне результат. Я не хотел бы выполнять этот селект в цикле с подгот. запросом - это ведь займет гораздо больше времени, чем выполнить 1 запрос. Строк в таблице товаров прихода немало. И для половины из них (которые запчасти) придется заново создавать новую таблицу SPARE_PART_LIST (удаляя старую) в новом запросе для каждой итерации. Я предполагал, что можно сделать нечто подобное: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. А именно в подзапросе вызывать in(SPARE_PART_LIST = call blabla(параметры)) для пересоздания новой таблицы для каждого товара (т.е. списка запчастей). Возможно ли нечто подобное? Или это возможно сделать лишь в цикле скрипта PHP, выясняя для каждого товара его запчасти, вызывать процедуру для пересоздания SPARE_PART_LIST, и возврата части результата для прикрепления к общему результату? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2016, 22:44 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
bannndi, янихренанепонял что тебе надо, но отвечу: все просто. заполняешь список деталей в одной процедуре потом делаешь запрос со сколько угодно подзапросами, или даже несколько запросов. возможно, в другой процедуре. потом очищаешь список , в третьей процедуре. расклад по процедурами в принципе произвольный , не жестко. да и свои понятия о "быстрее/ медленнее" лучше оставь при себе, а еще лучше вообще забудь, все не так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2016, 09:17 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
bannndi, еще потом посмотрю, Может таки врулюсь чего ж тебе надо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2016, 09:19 |
|
||
|
возврат таблицы из хранимой процедуры для использования в in()
|
|||
|---|---|---|---|
|
#18+
Отвечаю на всякий случай прямо на поставленные вопросы , может будет полезно. bannndi Каким образом будет вызываться данная процедура множество раз в подзапросе подсчета суммы количеств товаров с этой запчастью? Никаким. Процедура будет вызываться ДО выполнения всех запросов и подзапросов, и ОДИН РАЗ. bannndi Я ведь пытаюсь одним запросом вернуть весь нужный мне результат. ... Есть следующая задачка - нужно в конструкции in() селекта подзапроса использовать значение поля, представленного в виде перечня неких чисел. А поскольку в in() нужно перечислить через запятую значения или воспользоваться подзапросом, - то мне нужно каким то образом преобразовать значение поля вида ("111,222,333") в in(111, 222, 333) или in(... таблица-последовательность этих чисел ...) Верни одним запросом весь результат, на здоровье. Это никак не заставляет тебя делать несколько раз "перечень неких чисел". авторЯ не хотел бы выполнять этот селект в цикле с подгот. запросом - это ведь займет гораздо больше времени, чем выполнить 1 запрос. Подготовленные запросы в таков (моём) варианте вообще не нужны. авторСтрок в таблице товаров прихода немало. И для половины из них (которые запчасти) придется заново создавать новую таблицу SPARE_PART_LIST (удаляя старую) в новом запросе для каждой итерации. Не придётся. Если тебе надо группировать запчасти по каким-то признакам, добавь в PK таблицы со списком запчастей ещё и поля (поле), обозначающие эти признаки. И одним запросом всё вычисляй, без каких-то циклов. авторЯ предполагал, что можно сделать нечто подобное: А именно в подзапросе вызывать in(SPARE_PART_LIST = call blabla(параметры)) для пересоздания новой таблицы для каждого товара (т.е. списка запчастей). Возможно ли нечто подобное? Или это возможно сделать лишь в цикле скрипта PHP, выясняя для каждого товара его запчасти, вызывать процедуру для пересоздания SPARE_PART_LIST, и возврата части результата для прикрепления к общему результату? Такое невозможно, но даже если бы было возможно, так делать было бы вредно и неправильно. А мы же плохому-то не учим... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2016, 18:57 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39151561&tid=1832231]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
147ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 469ms |

| 0 / 0 |
