|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
Есть следующие таблицы в БД. БД вида "продукт - свойства" ####### #Product# ####### ID PRIMARY KEY INT UNIQUE name VARCHAR(255) description VARCHAR(255) ######## #property# ######## ID INT PRIMARY KEY UNIQUE product_id INT FOREIGN KEY (Product) name VARCHAR(255) value VARCHAR(255) Хочу выполнить примерно следующий запрос: "Выбрать все продукты со всеми свойствами. Условие: Значение определенного свойства (value) = 'текст' ". Не могу сконструировать запрос, ничего путевого кроме WHERE id IN() не приходит. Таблицы предполагаются: product ~ 20 000 записей property примерно на порядок больше Код: sql 1.
Только одно условие для поиска Код: sql 1.
Вернет мне список всех продуктов со всеми свойствами (я надеюсь :) ), но не понятно как дальше с ним поступать. Как выбрать продукты со всеми свойствами, у которого заданы определенные значение свойств? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2013, 18:11 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
Guest man, Что мешает во второй запрос добавить условие WHERE и нужные поля? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2013, 19:36 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
pit_alex, На один товар приходится множество свойств. При добавлении WHERE будет выбран продукт с одним свойством, а не со всеми ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2013, 20:40 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
Guest manpit_alex, На один товар приходится множество свойств. При добавлении WHERE будет выбран продукт с одним свойством, а не со всемиТогда убери where. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2013, 20:52 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
White Owl, Тогда как сделать выборку товаров со свойствами при условии что одно(несколько) свойств равно x,y,z...? P.S. WHERE предложил не я ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2013, 20:56 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
Прочитай: 13467826 Оформи свои желания в соответствии с этой инструкцией и тогда мы поймем чего-же ты хочешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2013, 21:05 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
White Owl, Благодарю за ман. 1) Убеждаюсь что я работаю с базой данных типа SQLite. Наличие другой базы данных исключено - увы 2) Пишу и публикую скрипт, создающий тестовые таблицы. Убедился в их работоспособности Код: 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.
3) Хочу получать товары (например hat и t-shirt) со всеми его свойствами (new, whool, red, xxl, new) используя при поиске значения свойств. Например так (prop.name = 'condition' and prop.value = 'new') или лучше даже так (prop.name = 'condition' and prop.value = 'new') and (prop.name='size' and prop.value='xxl') 4) Хочу на выходе иметь: для prop.name = 'condition' and prop.value = 'new' id prod_name prop_name value1 hat color red1 hat material whool1 hat condition new2 t-shirt condition new2 t-shirt size xxl2 t-shirt material cotton для (prop.name = 'condition' and prop.value = 'new') and (prop.name='size' and prop.value='xxl') id prod_name prop_name value2 t-shirt condition new2 t-shirt size xxl2 t-shirt material cotton 5) Убеждаюсь что текстовое описание результата (из пункта 3) совпадает с результатом который я привел в пункте 4. Между текстом и примером не наблюдаю расхождений. Жду помощи, а не много вопросов на тему: "а ты сам знаешь что ты хочешь?" 6) Пытаюсь: Код: sql 1. 2.
Ожидаемо получаю результат id prod_name prop_name value1 hat condition new2 t-shirt condition new Просто никаких идей с какой стороны за это взяться Спасибо, надеюсь на вашу помощь ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2013, 22:02 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
Guest man, джойнуть prod к prop (а не наоборот, как сейчас)? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2013, 22:24 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
фигню какую-то написал)) ты хочешь результаты master+detail датасета запихнуть в 1 выборку, продублировав master'а мне пока тоже пришел в голову или вариант where id in (), или вот такой маразм)) Код: sql 1. 2. 3.
интересно, какой из запросов быстрее отработает)) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2013, 22:48 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
или даже так Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2013, 22:53 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
Ну а для набора атрибутов можно сделать так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 02:59 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
White Owl, fd00ch Спасибо вам большое, очень помогли. Я сам как-то позабыл что join объединяет только те строки у которых есть соответствие и слева и справа. А последовательно JOINы работают как AND условие. Я немного модифицировал запрос, что скажете? авторsqlite> select prod.id, prod.name, prop.name, prop.value from prod ...> join ( ...> select prod_id from prop where prop.name = 'condition' and prop.value = 'new' ...> intersect ...> select prod_id from prop where prop.name = 'size' and prop.value = 'xxl' ...> ) ids ...> on ids.prod_id=prod.id ...> join prop on prod.id=prop.prod_id; 2|t-shirt|condition|new 2|t-shirt|material|cotton 2|t-shirt|size|xxl мне показалось, что сперва лучше отфильтровать продукты, чтобы не JOINить все продукты с атрибутами (я так предполагаю, план запроса я не смотрел, каюсь), а потом к ним JOIN их свойств. Исправьте если не прав. Еще раз спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 10:04 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
Guest man , а Вам не кажется, что лучше иметь три таблицы, а не две? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
такая нормализация не помешает и можно получать всё, что захочешь ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 12:00 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
AIS, Бррр, поясните как получать то, что я захочу? Пока чего-то в ступоре ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 12:38 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
AIS, тогда уж вводить таблицы prod, prop-name, prop-value, prod-prop :о) Guest man, выборка делается так же, только джойнов поболее а по порядку указывания таблиц - мне казалось, выгоднее мелкие таблицы джойнить первыми, а крупные - последними; или же сначала джойнить по индексу, а в конце - через fullscan (хотя оптимизатор все равно будет работать и может изменить логику). если у тебя есть тестовые данные - можешь попробовать сделать замеры с разным порядком таблиц ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 12:49 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
AIS, Код: sql 1. 2. 3.
Если не ошибаюсь, это вернет то, что нужно мне... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 12:53 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
fd00ch, Тестовые данные есть. Так в том то и дело, что продуктов меньше чем их свойств (на каждый продукт приходится по 15-16 атрибутов) и делая join ( ...> select prod_id from prop where prop.name = 'condition' and prop.value = 'new' ...> intersect ...> select prod_id from prop where prop.name = 'size' and prop.value = 'xxl' ...> ) ids ...> on ids.prod_id=prod.id; мы таким образом выбираем id только интересных нам продуктов, а потом к ним по индексу join наших свойств. Тестовая выборка prod ~ 300 шт. prop ~ 5500 шт. Время запросов что-то около 0.004s AMD E-350 1.6ghz 2gb У меня вообще другая идея пришла Код: sql 1. 2. 3.
Код: sql 1. 2.
Еще не прогнал в sqlite3, но думаю что заработает ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 13:06 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
fd00chAIS, тогда уж вводить таблицы prod, prop-name, prop-value, prod-prop :о) Если prop-value имеют какие-то определенные, ограниченные по количеству варианты значений и встречаются в разных prop, то лучше так и сделать. А если prop-value это беспорядочные значения, которые по колизии могут конечно быть одинаковыми в разных prop, но не более, то эти список таблиц мягко говоря избыточный. Guest manБррр, поясните как получать то, что я захочу? Вы не знаете как в моем варианте БД вывести все свойства для продукта с опредленным ID? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 13:19 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
AIS, Можно на Ты. Нет, я не могу сообразить пока как при такой схеме ввести ограничения на атрибуты (name='condition', value='new'; name = 'size', value = 'xxl'), но я так понял будет также как и при 2х таблицах А select будет такой же, только появится дополнительный join ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 13:32 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
Конечно же не работает Код: sql 1. 2. 3. 4.
От подзапросов и intersect видимо не уйти :( Код: sql 1. 2. 3. 4. 5. 6. 7.
Скажите, пожалуйста, есть ли альтернативный способ организации базы, чтобы упростить поиск? Я прошу прощения за свою глупость, но осуждайте грех, а не грешника ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 13:49 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
Guest manСкажите, пожалуйста, есть ли альтернативный способ организации базы, чтобы упростить поиск?поиск и так несложный, че ты его упрощать вздумал? а по организации - скорее всего, подойдет вариант, о котором я писал выше - еще большее разбиение. т.к. у реальных товаров свойства или находятся в ограниченном списке (для строк), или в ограниченном диапазоне значений (для чисел). можно в таблицу prop-name добавить столбец prop_type, где хранить тип свойства (integer/float/string), а в таблицу prop-value пихать значения, невзирая на тип столбца value (благо, sqlite это позволяет). такая организация позволит сделать удобные и быстрые фильтры в будущем, как на Яндекс.Маркете а в таблицу prod-prop добавить столбец index, чтобы все свойства товара выводить в нужном порядке (или даже несколько столбцов для организации дерева свойств, как на том же Маркете) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 13:59 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
fd00ch, Если говорить о реальном приложении, то у меня организовано следующим образом Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 14:27 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
Guest man, от задачи все зависит ты планируешь сделать фильтры товаров по свойствам, где будут использоваться списки всех значений с множественным выбором или ползунки - для чисел (как в Маркете)? плюс, отображение "на лету" числа товаров, которые остались после применения фильтров если да - то твоя схема - говно :о) о чем будут намекать постоянные distinct'ы при построении вышеупомянутых списков всех значений + необходимость индексировать строковый столбец в большой таблице prop (чтобы distinct работал быстро, да и последующий where). вместо использования небольших таблиц-справочников и быстрого соотношения pk-fk если даже в голубых мечтах такая интерактивность не грозит - твоя схема сойдет, легче ж запросы писать)) если других схожих "примочек" не будет, конечно ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 14:53 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
fd00ch, Да, спасибо большое. Очень ценю искренность и прямоту в людях. Я понимаю что схема говно, с этим даже спорить трудно :) Я пока не большой специалист в этом, но не ошибается тот кто ничего не делает. Буду учиться. Действительно, я не учел того что pk-fk быстрое соотношение и я бы мог Код: sql 1.
А потом по быстрому в таблицах шарить + join's Но в какой-то мере это legacy код. За ошибки молодости... Да простит меня SQL бог. Еще раз всем спасибо. Стало намного яснее. Очень давно не занимался sql. Еще раз простите. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 15:33 |
|
Отношение типа "продукт-свойства". Выборка продукты+все свойства + условия на свойствам
|
|||
---|---|---|---|
#18+
Guest manЯ понимаю что схема говно, с этим даже спорить трудно :)ключевая мысль пред.поста - от задачи все зависит. которую тут никто, кроме тебя, не знает ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 15:53 |
|
|
start [/forum/topic.php?fid=54&msg=38336158&tid=2008887]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 275ms |
total: | 421ms |
0 / 0 |