Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Очень сложный запрос (сложная архитектура БД) / 22 сообщений из 22, страница 1 из 1
06.04.2010, 14:48
    #36563493
Очень сложный запрос (сложная архитектура БД)
Имеется БД. БД спроектирована по особому (форм нормализации нет).
Архитектура следующая (все таблицы не пишу):

Продукты:
ID K V
1 Name some_name
1 Category 13123123
1 Description lalalalalalalalallala
1 Producer 2
........................................


Производители:
ID K V
2 Title some_title
2 Info plsdpasldplsad
2 Addr lalalalalalalalallala

Как все догадались поле K - названия свойств объекта, а V - значение свойства.
Допустим, в продукте имеется ссылку на производителя (ID=10, K=Producer, V=2(ID производителя)).
Как сделать выборку, чтобы выбрались данные из 2-х таблиц, но при этом, чтобы формат вывода был [ID, K, V]?
Т.е. на выходе имеем:
ID K V
1 Name some_name
1 Category 13123123
1 Description lalalalalalalalallala
1 Producer some_title (т.е. место ID подставили Title)



Помогите пожалуйста. И как называется такой метод проектирования БД?
...
Рейтинг: 0 / 0
06.04.2010, 15:06
    #36563550
Очень сложный запрос (сложная архитектура БД)
Неужели никто не знает? =)
Гугл мне помочь не смог ((
...
Рейтинг: 0 / 0
06.04.2010, 15:13
    #36563577
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень сложный запрос (сложная архитектура БД)
Ищите по словам "Тенцер" и "EAV".
Только у вас несколько извращенная разновидность из-за "K - названия свойств объекта". Обычно названия свойств выносятся в справочник.

Имхо, имеет смысл к применению только в тех случаях, когда требуется сверхгибкость и можно пожертвовать производительностью (а иногда и надежностью).
...
Рейтинг: 0 / 0
06.04.2010, 15:29
    #36563627
Очень сложный запрос (сложная архитектура БД)
Спасибо громадное. Посмотрю.
...
Рейтинг: 0 / 0
07.04.2010, 10:05
    #36564953
Очень сложный запрос (сложная архитектура БД)
Вопрос остается актуальным. Научился делать выборку по связям из нескольких таблиц (с помощью union). А как сделать выборку на основе определенного условия (where V='some_value'?). Нужно, чтобы все свойства объекта попадали в ответ. Как то сделать, кто знает, ответьте пожалуйста.
...
Рейтинг: 0 / 0
07.04.2010, 10:46
    #36565065
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень сложный запрос (сложная архитектура БД)
Ищите лучше. Все обсуждалось много раз, в т.ч. и на этом форуме, в т.ч. и на этом подфоруме.

Чаще всего решение выглядит примерно так:
Код: plaintext
1.
2.
3.
4.
SELECT ID
FROM mytable
WHERE (K,V) IN (('Category','13123123'),('Description','lalalalalalalalallala'))
GROUP BY ID
HAVING COUNT(*)= 2 
P.S. Конструкция IN показана для наглядности. Насколько я помню, в MySQL с несколькими значениями в левой части она не работает.
...
Рейтинг: 0 / 0
07.04.2010, 11:07
    #36565142
Очень сложный запрос (сложная архитектура БД)
Нет. Такой запрос вернет по одной строке для каждого объекта. Мне же нужно, чтобы запрос возвращал все строки нужного объекта (все свойства), но при определенном условии.
К примеру. Вернуть все продукта, у которых цена больше 100 - запрос. Нужно чтобы вернулсиь все свойства продукта причем в формате ID, K, V.
...
Рейтинг: 0 / 0
07.04.2010, 11:17
    #36565174
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень сложный запрос (сложная архитектура БД)
Используйте соединение (JOIN) вашей таблицы с подзапросом, выдающем нужный набор ID.
...
Рейтинг: 0 / 0
07.04.2010, 11:34
    #36565233
Очень сложный запрос (сложная архитектура БД)
Да, спасибо, так и сделал.
Но, при связях с другими сущностями (делаю через union, т.к. нужен формат выхода ID K V)
Почему-то не получается сгруппировать и выдать условие по having.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select p_ext.ID, p_ext.K, p_ext.V from LS_Product as p_ext
	join LS_Product as p_q on (p_q.ID = p_ext.ID and p_q.K = 'Number' and p_q.V = '1')
where p_ext.K in ('Description', 'Cost', 'Number')
	union
		select  pr.ID, pr.K, depot.V from LS_Product as pr
			join LS_Depot as depot on depot.ID = pr.V and depot.K = 'Title'
	union
	        select  p.ID, p.K, prod.V from LS_Product as p
			join LS_Producer as prod on prod.ID = p.V and prod.K = 'Title'
group by p_ext.ID, p_ext.K, p_ext.V
	having p_ext.ID = p_q.ID
order by  1 ,  2 
...
Рейтинг: 0 / 0
07.04.2010, 14:19
    #36565942
Очень сложный запрос (сложная архитектура БД)
Неужели никто не знает? =)
...
Рейтинг: 0 / 0
07.04.2010, 14:33
    #36565989
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень сложный запрос (сложная архитектура БД)
авторПроизводители:
ID K V
2 Title some_title
2 Info plsdpasldplsad
2 Addr lalalalalalalalallala

Как все догадались поле K - названия свойств объекта, а V - значение свойства.интересно - а как у вас выглядят данные для второго производителя? Покажите пожалуста...
...
Рейтинг: 0 / 0
07.04.2010, 14:46
    #36566053
Очень сложный запрос (сложная архитектура БД)
Модель EAV.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ID      K         V
 2       Title      some_title
 2       Info      plsdpasldplsad
 2       Addr      lalalalalalalalallala
 3       Title      some_title131
 3       Info      plsdpasldplsad21wqr
 3       Addr      lalalalalalalalallalawqrwqrwq
 4       Title      some_title14
 4       Info      plsdpasldplsadwqrw
 4       Addr      lalalalalalalalallalawqrwqr
...
Рейтинг: 0 / 0
07.04.2010, 14:50
    #36566072
Очень сложный запрос (сложная архитектура БД)
Изменю вопрос.
Как мне условие where (либо having) применить для всех подзапросов (union включая)?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select p_ext.ID, p_ext.K, p_ext.V from LS_Product as p_ext
	join LS_Product as p_q on (p_q.ID = p_ext.ID and p_q.K = 'Number' and p_q.V = '1')
where p_ext.K in ('Description', 'Cost', 'Number')
	union
		select  pr.ID, pr.K, depot.V from LS_Product as pr
			join LS_Depot as depot on depot.ID = pr.V and depot.K = 'Title'
	union
	        select  p.ID, p.K, prod.V from LS_Product as p
			join LS_Producer as prod on prod.ID = p.V and prod.K = 'Title'
group by p_ext.ID, p_ext.K, p_ext.V
	having p_ext.ID = p_q.ID
order by  1 ,  2 

...
Рейтинг: 0 / 0
07.04.2010, 15:04
    #36566130
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень сложный запрос (сложная архитектура БД)
Никакой MySQL-специфики в теме не вижу, так что, пожалуй, топик перенесу.

Модератор: Тема перенесена из форума "MySQL".
...
Рейтинг: 0 / 0
07.04.2010, 15:06
    #36566138
Очень сложный запрос (сложная архитектура БД)
А тему куда перенесли?
...
Рейтинг: 0 / 0
07.04.2010, 15:07
    #36566140
Очень сложный запрос (сложная архитектура БД)
Спецификация MySQl налицо. Мне нужно именно для MySql запрос.
...
Рейтинг: 0 / 0
07.04.2010, 15:20
    #36566174
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень сложный запрос (сложная архитектура БД)
извините догадался
как-то так
Код: plaintext
1.
2.
3.
4.
select t.ID , 
       t.K, 
       IF(t.K<>'Producer', t.V, SELECT p.V 
                                       from PROIZV as p WHERE p.ID=t.V AND p.K='Title') 
from product as t 
метод "хранения" данных называется -"файл для передачи данных в ГНИ или ПФР в текстовом виде" :-)
все нужно переводить в "горизонтальный" вид
...
Рейтинг: 0 / 0
07.04.2010, 15:26
    #36566193
Очень сложный запрос (сложная архитектура БД)
в том то и дело, что мне нужны данные в вертикальном формате =) (поля ID, K, V)
...
Рейтинг: 0 / 0
07.04.2010, 15:47
    #36566264
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень сложный запрос (сложная архитектура БД)
MaratCrashCrashCrashв том то и дело, что мне нужны данные в вертикальном формате =) (поля ID, K, V)я вам показал запрос, который выведет "вертикальный" формат
ID K V1 Name some_name1 Category 131231231 Description lalalalalalalalallala1 Producer some_title (т.е. место ID подставили Title)
...
Рейтинг: 0 / 0
07.04.2010, 16:26
    #36566431
Очень сложный запрос (сложная архитектура БД)
Ага, а как применить несколько условий к V?
...
Рейтинг: 0 / 0
07.04.2010, 23:52
    #36567237
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень сложный запрос (сложная архитектура БД)
А какие условия вам еще надо ???
...
Рейтинг: 0 / 0
08.04.2010, 10:33
    #36567690
Очень сложный запрос (сложная архитектура БД)
Alex_Ustinov,

Вы до конца не поняли суть запроса. Нужно чтобы выбирались все свойства объектов, определяющих определенному условию (к примеру, когда K = 'Name' и V = 'Crash' - это только одно услвоие, а может быть сколько угодно).
Запрос я сделал.
Нужно было просто сгурппировать записи и в having сделать проверку на ID, которые получаем из подзапросов в having. Все просто оказалось =)
Всем спасибо.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Очень сложный запрос (сложная архитектура БД) / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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