
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
06.04.2015, 16:07:13
|
|||
|---|---|---|---|
|
|||
Можно ли сделать без курсора? |
|||
|
#18+
Добрый день! Имеется табличка с такими полями: id, code, code_text [, тут ещё много полей, сейчас суть не в них]. Поле code содержит код признака, который относится к данному id (т.е. поле id не уникально, но пара id-code уникальна). Нужно вытащить для каждого id строку вида : id, code_text1, code_text2, ... количество кодов фиксировано, например: Есть таблица: id|code | code_text 1 name Иванов 1 lname Иван 1 phone 123 2 name Петров 2 lname Петр 2 phone 456 Результат должен быть таким: id| name | lname | phone 1 Иван Иванов 123 2 Петр Петров 456 ----------------------------------- Я реализовал довольно простую идею: взял исходную таблицу и наплодил её проекций. Например t1 содержит id, code, code_text WHERE code = 'name', а потом склеил их джоином. Так как в действительности признаков аж 16 штук, а записей в исходной таблице несколько сот тысяч, работает это всё не ахти как быстро. Есть ещё идея решить задачу с помощью курсора, например: SELECT DISTINCT id FROM :source, потом по каждому айди в цикле пробегать исходную таблицу... в общем, боюсь это тоже небыстро будет. Может быть я упускаю элементарный способ решения? Или есть какой-то не такой очевидный, но быстроработающий способ решения, который вы увидели? Буду рад любой помощи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 16:16:17
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
А просто 15 JOIN-ов таблицы самой на себя чем не годится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 16:26:37
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
miksoftА просто 15 JOIN-ов таблицы самой на себя чем не годится? Так он видимо это и имеет в виду. Хотя конечно лучше бы просто запрос написал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 16:29:38
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
MasterZivТак он видимо это и имеет в виду.Возможно. Я затруднился в трактовке термина "проекция" в данном контексте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 16:33:11
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
alekcyxЯ реализовал довольно простую идею: взял исходную таблицу и наплодил её проекций. Например t1 содержит id, code, code_text WHERE code = 'name', а потом склеил их джоином. Запрос опубликуй. И описание таблиц по show сreate table. alekcyx Так как в действительности признаков аж 16 штук, а записей в исходной таблице несколько сот тысяч, работает это всё не ахти как быстро. Не должно это тормозить, если всё правильно делать. Давай запрос и описания таблиц. alekcyxЕсть ещё идея решить задачу с помощью курсора, например: SELECT DISTINCT id FROM :source, потом по каждому айди в цикле пробегать исходную таблицу... в общем, боюсь это тоже небыстро будет. Ни в коем случае . alekcyxМожет быть я упускаю элементарный способ решения? Или есть какой-то не такой очевидный, но быстроработающий способ решения, который вы увидели? Буду рад любой помощи. Быстроработающий и элементарный -- это Код: sql 1. 2. 3. 4. 5. 6. А, ну кстати есть и ещё элементарнее -- показывать пользователю просто в том же виде, что и хранится (когда-то это называлось "режим CHANGE"): в каждой строке -- имя атрибута и значение атрибута. Но это не всегда возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 16:36:28
|
|||
|---|---|---|---|
|
|||
Можно ли сделать без курсора? |
|||
|
#18+
alekcyx, то что ты хочешь - суть есть CROSS TAB. В ANSI-SQL делается посредством PIVOT, но в MySQL оно недоступно. Поэтому по старинке - либо мультисамообъединение, либо CASE + GROUP BY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 16:55:52
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
alekcyxЕсть ещё идея решить задачу с помощью курсораЗабудь её срочно! alekcyxТак как в действительности признаков аж 16 штук, а записей в исходной таблице несколько сот тысяч, работает это всё не ахти как быстро.На 100к записей должно взлетать с громким жужжанием! Думаю, твоя проблема в том, что 1) возможно, ты неправильно связываешь (небось, только по ID?); 2) возможно, нет необходимого индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 17:19:45
|
|||
|---|---|---|---|
|
|||
Можно ли сделать без курсора? |
|||
|
#18+
MasterZiv Быстроработающий и элементарный -- это Код: sql 1. 2. 3. 4. 5. 6. Сейчас почти так и делаю, только т.к. я пишу процедуру я делаю так: Код: sql 1. 2. 3. 4. Добрый Э - Эхalekcyx, то что ты хочешь - суть есть CROSS TAB. В ANSI-SQL делается посредством PIVOT, но в MySQL оно недоступно. Поэтому по старинке - либо мультисамообъединение, либо CASE + GROUP BY Можно примерчик? Не пойму что имеется ввиду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 17:21:54
|
|||
|---|---|---|---|
|
|||
Можно ли сделать без курсора? |
|||
|
#18+
Akina1) возможно, ты неправильно связываешь (небось, только по ID?); Есть такое, а почему это неправильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 17:22:52
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
alekcyxпроцедуру я делаю так: Код: sql 1. 2. 3. 4. А у Вас точно MySQL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 17:41:36
|
|||
|---|---|---|---|
|
|||
Можно ли сделать без курсора? |
|||
|
#18+
AkinaА у Вас точно MySQL? А что повергает Вас в пучину сомнений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 17:43:50
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
alekcyx , ну, например, отсутствие в MySQL табличных переменных... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 17:55:47
|
|||
|---|---|---|---|
|
|||
Можно ли сделать без курсора? |
|||
|
#18+
Akina alekcyx , ну, например, отсутствие в MySQL табличных переменных... Но разве это важно? Разве отсутствие каких-то табличных переменных может остановить нескончаемый поток мыслей и идей? =) СУБД, для которой я пишу процедуру, не представлена на форуме, поэтому я решил написать в эту ветку. Но до настоящего шпиона мне, конечно, далеко - прокололся на такой мелочи. В случае если на меня сейчас все ополчатся - спасибо за помощь всем участникам обсуждения, вы натолкнули меня на ход решения. Хотя от примера с CASE и ORDER BY я бы не отказался =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 18:04:44
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
alekcyxСУБД, для которой я пишу процедуру, не представлена на форуме, поэтому я решил написать в эту ветку.Ну тогда имело смысл выбрать наиболее близкую по возможностям СУБД и сразу её озвучить. alekcyxот примера с CASE и ORDER BY я бы не отказался =)Для решения поставленной задачи они не нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 18:29:37
|
|||
|---|---|---|---|
|
|||
Можно ли сделать без курсора? |
|||
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 18:30:16
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
alekcyxselect ... from OBJECT o left join OBJECT_ATTR oa1 on o.object_id = oa1.object_id and oa.code = 'name' left join OBJECT_ATTR oa1 on o.object_id = oa1.object_id and oa.code = 'iname' left join OBJECT_ATTR oa1 on o.object_id = oa1.object_id and oa.code = 'phone' ... Можно примерчик? Не пойму что имеется ввиду. Думаю, имелось в виду что-то типа того: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 18:30:46
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
Akina alekcyx , ну, например, отсутствие в MySQL табличных переменных... Это он пошутил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.04.2015, 18:35:00
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
alekcyxСУБД, для которой я пишу процедуру, не представлена на форуме, поэтому я решил написать в эту ветку.Формально говоря, у нас есть подфорумы "Другие СУБД" и " NoSQL, Big Data". Возможно, имеет смысл перенести топик в один из них. Но если хотите, могу и не переносить. Но СУБД лучше таки указать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.04.2015, 08:35:07
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
miksoft, ИМХО, это абстрактный вопрос абстрактного применения EAV. поскольку похоже его теперь дают даже школьникам... :) Похоже пора выделять в отдельный топик "применение EAV" и собирать туда все типовые вопросы и решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.04.2015, 09:30:54
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
Arhat109ИМХО, это абстрактный вопрос абстрактного применения EAV. поскольку похоже его теперь дают даже школьникам... :)В целом - согласен. Но в данном случае сложно дать рекомендации по оптимизации, не зная СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.04.2015, 08:02:00
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
miksoft, Так а чего там знать? EAV - он и в африке ЕАВ... :) Там вариаций "раз-два и обчелся": упрощенное хранение повдоль (три таблички, а то и вовсе даже 2) и "размазанное", пардон типизованное сильно или не очень (значения-строки, значения-числа, группированные/иерархические параметры и т.д.)... во всех случаях разные "многоДжойны", "групконкаты" и "хэвинги" - наше всё. Дать "образец" как из повдоль делается параметризованная выборка, или собираются массивы подчиненных значений групконкатом... для начала хватит, думаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.04.2015, 09:32:07
|
|||
|---|---|---|---|
Можно ли сделать без курсора? |
|||
|
#18+
Arhat109, Так я говорил не про вообще, а в данном конкретном случае и конкретно про оптимизацию. Мало ли что там за СУБД, может там индексов вообще нет, или еще какая подстава :) А в целом, повторюсь, согласен. P.S. Было как-то дело, когда на большой табличке (порядка 10М записей) MySQL выборку делал часа два через group by+having count=N и 10-20 минут через 15 JOIN-ов. Пришлось делать гибрид этих вариантов, который уже отрабатывал за доли секунды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/search_topic.php?author=Ferro7&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
48ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 636ms |
| total: | 785ms |

| 0 / 0 |
