Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Можно ли сделать без курсора? / 22 сообщений из 22, страница 1 из 1
06.04.2015, 16:07:13
    #38928236
alekcyx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
Добрый день! Имеется табличка с такими полями: 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, потом по каждому айди в цикле пробегать исходную таблицу... в общем, боюсь это тоже небыстро будет.
Может быть я упускаю элементарный способ решения? Или есть какой-то не такой очевидный, но быстроработающий способ решения, который вы увидели? Буду рад любой помощи.
...
Рейтинг: 0 / 0
06.04.2015, 16:16:17
    #38928250
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
А просто 15 JOIN-ов таблицы самой на себя чем не годится?
...
Рейтинг: 0 / 0
06.04.2015, 16:26:37
    #38928278
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
miksoftА просто 15 JOIN-ов таблицы самой на себя чем не годится?

Так он видимо это и имеет в виду.
Хотя конечно лучше бы просто запрос написал...
...
Рейтинг: 0 / 0
06.04.2015, 16:29:38
    #38928285
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
MasterZivТак он видимо это и имеет в виду.Возможно. Я затруднился в трактовке термина "проекция" в данном контексте.
...
Рейтинг: 0 / 0
06.04.2015, 16:33:11
    #38928293
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
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.
select ...
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'
...




А, ну кстати есть и ещё элементарнее -- показывать пользователю просто в том же виде, что и хранится (когда-то это называлось "режим CHANGE"):
в каждой строке -- имя атрибута и значение атрибута. Но это не всегда возможно.
...
Рейтинг: 0 / 0
06.04.2015, 16:36:28
    #38928295
Можно ли сделать без курсора?
alekcyx,

то что ты хочешь - суть есть CROSS TAB. В ANSI-SQL делается посредством PIVOT, но в MySQL оно недоступно. Поэтому по старинке - либо мультисамообъединение, либо CASE + GROUP BY
...
Рейтинг: 0 / 0
06.04.2015, 16:55:52
    #38928337
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
alekcyxЕсть ещё идея решить задачу с помощью курсораЗабудь её срочно!

alekcyxТак как в действительности признаков аж 16 штук, а записей в исходной таблице несколько сот тысяч, работает это всё не ахти как быстро.На 100к записей должно взлетать с громким жужжанием!
Думаю, твоя проблема в том, что 1) возможно, ты неправильно связываешь (небось, только по ID?); 2) возможно, нет необходимого индекса.
...
Рейтинг: 0 / 0
06.04.2015, 17:19:45
    #38928383
alekcyx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
MasterZiv
Быстроработающий и элементарный -- это

Код: sql
1.
2.
3.
4.
5.
6.
select ...
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.
TABLE1 = SELECT * FROM source WHERE code = 'name'
TABLE2 = SELECT * FROM source WHERE code = 'lname'
....
SELECT ... FROM source s LEFT JOIN TABLE1 t1 ON s.id=t1.id LEFT JOIN TABLE2 t2 on s.id=t2.id ...


Добрый Э - Эхalekcyx,

то что ты хочешь - суть есть CROSS TAB. В ANSI-SQL делается посредством PIVOT, но в MySQL оно недоступно. Поэтому по старинке - либо мультисамообъединение, либо CASE + GROUP BY
Можно примерчик? Не пойму что имеется ввиду.
...
Рейтинг: 0 / 0
06.04.2015, 17:21:54
    #38928385
alekcyx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
Akina1) возможно, ты неправильно связываешь (небось, только по ID?);
Есть такое, а почему это неправильно?
...
Рейтинг: 0 / 0
06.04.2015, 17:22:52
    #38928386
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
alekcyxпроцедуру я делаю так:
Код: sql
1.
2.
3.
4.
TABLE1 = SELECT * FROM source WHERE code = 'name'
TABLE2 = SELECT * FROM source WHERE code = 'lname'
....
SELECT ... FROM source s LEFT JOIN TABLE1 t1 ON s.id=t1.id LEFT JOIN TABLE2 t2 on s.id=t2.id ...


А у Вас точно MySQL?
...
Рейтинг: 0 / 0
06.04.2015, 17:41:36
    #38928401
alekcyx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
AkinaА у Вас точно MySQL?
А что повергает Вас в пучину сомнений?
...
Рейтинг: 0 / 0
06.04.2015, 17:43:50
    #38928402
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
alekcyx , ну, например, отсутствие в MySQL табличных переменных...
...
Рейтинг: 0 / 0
06.04.2015, 17:55:47
    #38928416
alekcyx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
Akina alekcyx , ну, например, отсутствие в MySQL табличных переменных...
Но разве это важно? Разве отсутствие каких-то табличных переменных может остановить нескончаемый поток мыслей и идей? =) СУБД, для которой я пишу процедуру, не представлена на форуме, поэтому я решил написать в эту ветку. Но до настоящего шпиона мне, конечно, далеко - прокололся на такой мелочи.
В случае если на меня сейчас все ополчатся - спасибо за помощь всем участникам обсуждения, вы натолкнули меня на ход решения. Хотя от примера с CASE и ORDER BY я бы не отказался =)
...
Рейтинг: 0 / 0
06.04.2015, 18:04:44
    #38928422
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
alekcyxСУБД, для которой я пишу процедуру, не представлена на форуме, поэтому я решил написать в эту ветку.Ну тогда имело смысл выбрать наиболее близкую по возможностям СУБД и сразу её озвучить.

alekcyxот примера с CASE и ORDER BY я бы не отказался =)Для решения поставленной задачи они не нужны.
...
Рейтинг: 0 / 0
06.04.2015, 18:29:37
    #38928444
Можно ли сделать без курсора?
alekcyxХотя от примера с CASE и ORDER BY я бы не отказался =)не ORDER, а GROUP.

STFF: ВТ-25-5
...
Рейтинг: 0 / 0
06.04.2015, 18:30:16
    #38928446
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
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.
select 
  o.object_id, ..., 
  MIN(case when oa.code = 'name' then oa.code_text else null end ) as name,
  MIN(case when oa.code = 'iname' then oa.code_text else null end ) as iname,
  MIN(case when oa.code = 'phone' then oa.code_text else null end ) as phone,
  ...

from OBJECT o
left join OBJECT_ATTR oa on o.object_id = oa.object_id 
group by o.object_id, ...
...
Рейтинг: 0 / 0
06.04.2015, 18:30:46
    #38928447
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
Akina alekcyx , ну, например, отсутствие в MySQL табличных переменных...

Это он пошутил...
...
Рейтинг: 0 / 0
06.04.2015, 18:35:00
    #38928448
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
alekcyxСУБД, для которой я пишу процедуру, не представлена на форуме, поэтому я решил написать в эту ветку.Формально говоря, у нас есть подфорумы "Другие СУБД" и " NoSQL, Big Data". Возможно, имеет смысл перенести топик в один из них.
Но если хотите, могу и не переносить.

Но СУБД лучше таки указать.
...
Рейтинг: 0 / 0
07.04.2015, 08:35:07
    #38928730
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
miksoft,

ИМХО, это абстрактный вопрос абстрактного применения EAV. поскольку похоже его теперь дают даже школьникам... :)

Похоже пора выделять в отдельный топик "применение EAV" и собирать туда все типовые вопросы и решения.
...
Рейтинг: 0 / 0
07.04.2015, 09:30:54
    #38928784
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
Arhat109ИМХО, это абстрактный вопрос абстрактного применения EAV. поскольку похоже его теперь дают даже школьникам... :)В целом - согласен. Но в данном случае сложно дать рекомендации по оптимизации, не зная СУБД.
...
Рейтинг: 0 / 0
09.04.2015, 08:02:00
    #38931339
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
miksoft,

Так а чего там знать? EAV - он и в африке ЕАВ... :)

Там вариаций "раз-два и обчелся": упрощенное хранение повдоль (три таблички, а то и вовсе даже 2) и "размазанное", пардон типизованное сильно или не очень (значения-строки, значения-числа, группированные/иерархические параметры и т.д.)... во всех случаях разные "многоДжойны", "групконкаты" и "хэвинги" - наше всё. Дать "образец" как из повдоль делается параметризованная выборка, или собираются массивы подчиненных значений групконкатом... для начала хватит, думаю.
...
Рейтинг: 0 / 0
09.04.2015, 09:32:07
    #38931431
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать без курсора?
Arhat109,

Так я говорил не про вообще, а в данном конкретном случае и конкретно про оптимизацию. Мало ли что там за СУБД, может там индексов вообще нет, или еще какая подстава :)

А в целом, повторюсь, согласен.

P.S. Было как-то дело, когда на большой табличке (порядка 10М записей) MySQL выборку делал часа два через group by+having count=N и 10-20 минут через 15 JOIN-ов. Пришлось делать гибрид этих вариантов, который уже отрабатывал за доли секунды.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Можно ли сделать без курсора? / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]