Помогите поправить запрос к БД

V
На сайте с 10.01.2012
Offline
85
363

Есть запрос выда:

SELECT * FROM zx_product 

LEFT JOIN zx_product_price ON zx_product.product_id = zx_product_price.product_id
LEFT JOIN zx_product_category_xref ON zx_product.product_id = zx_product_category_xref.product_id

Таблица zx_product_category_xref имеет следующий вид http://SSMaker.ru/f4d4fdf3/

Выше составленный запрос выбирает первое вхождение category_id (в моем случае меньшее), а нужно выбрать или оба через запятую или большее.

Есть какие-то соображения?

Заранее благодарю за помощь

VHS
На сайте с 28.09.2007
Offline
142
VHS
#1

Очень слабая постановка задачи, неясно что в других двух таблицах. По факту глубоко пофигу что в третей таблице, так как набор задается в первой, а остальные цепляются по условию связи.

totamon
На сайте с 12.05.2007
Offline
437
#2

если в приоритете в запросе категория, так и делайте выборку по этой таблице, в вашем запросе идет выборка по продукту, он один и категория берется одна первая из таблицы...

что то вроде

SELECT * FROM zx_product_category_xref  

LEFT JOIN zx_product zx_ON zx_product.product_id = zx_product_category_xref.product_id
LEFT JOIN product_price ON zx_product.product_id = zx_product_price.product_id

выведет обе категории

одну категорию можно вывести через группировку и MAX или сортировку с лимитом.

и пишите нормальный запрос, на схематический вопрос вы получаете схематический ответ))

Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget
V
На сайте с 10.01.2012
Offline
85
#3
totamon:

выведет обе категории
...
и пишите нормальный запрос, на схематический вопрос вы получаете схематический ответ))

Запрос не схематически, а вполне нормально работающий, правда приходится запускать его дважды с ORDER и присоединением.

А фрагмент запроса в вашем случае вообще ничего не выведет, zx_product zx_ON - явная белиберда)))

VHS
На сайте с 28.09.2007
Offline
142
VHS
#4

Если нормально написать условие и поля таблица - получишь нормальный ответ. Запрос более чем схематичный.

totamon
На сайте с 12.05.2007
Offline
437
#5
Varenik:
А фрагмент запроса в вашем случае вообще ничего не выведет, zx_product zx_ON - явная белиберда)))

ну пропустил пробел... неужто не понятно, мне его не выполнять, и на ошибки не проверять) я вам про "главное", а вы мне пробел пропущенный...

K
На сайте с 03.06.2015
Offline
45
#6

"Схема" вот такая


SELECT * FROM zx_product as pr
LEFT JOIN zx_product_price as pp
ON pr.product_id = pp.product_id
LEFT JOIN zx_product_category_xref as pc
ON pr.product_id = pc.product_id

дает кортеж всех перечисленных таблиц без условий. К продуктам будет добавлена цена и категория. Никаких "вхождений" тут не будет, просто телега станет немного шире.

MYSQL PHP JS HTML CSS SEO TXT США СССР
VHS
На сайте с 28.09.2007
Offline
142
VHS
#7
kostyanet:
"Схема" вот такая


SELECT * FROM zx_product as pr
LEFT JOIN zx_product_price as pp
ON pr.product_id = pp.product_id
LEFT JOIN zx_product_category_xref as pc
ON pr.product_id = pc.product_id


дает кортеж всех перечисленных таблиц без условий. К продуктам будет добавлена цена и категория. Никаких "вхождений" тут не будет, просто телега станет немного шире.

А товарищ не хочет слышать. Выдал структуру одной таблицы и ждет экстрасенсов...

Составленный выше запрос выбирает все что есть, а для ограничений нет ни одного поля из первой таблицы

K
На сайте с 03.06.2015
Offline
45
#8

А, понял, zx_product_category_xref - n:M - телега должна еще и удлиниться. Ну все правильно выше было сказано - выбираете по соединительной таблице. Например таблица категорий та самая и тогда запрос:

select * from category as c

left join product as p

on p.id=c.pid

расширит ее данными из продуктов. Скажем в продуктах 100 записей, в категориях - 200 - получится 200 с повторами.

Теперь снизу дописываете все остальные нужные отношения и они попАдают в те же 200 туплей.

---------- Добавлено 12.06.2015 в 14:30 ----------

Есть гипотеза что в синтаксисе Оракл можно начинать с продуктов.

select * from product p, category c where p.id=c.pid;

Это join, просто без кляузы join. В теории драйвер должен сделать полное произведение двух таблиц, а потом из него выбрать только те отношения, которые удовлетворяют условию where.

---------- Добавлено 12.06.2015 в 14:35 ----------

Признаюсь что соображаю туго, не каждый день приходится заниматься проектированием бд, да и бд все какие-то простые попадаются, поэтому забывается. В общем чтобы начать с продуктов можно попробовать перевернуть на right join.

Определенно помню только факт, что если запрос настолько кривой, что оптмизатор его ниасилил, начнутся страшные лаги. Лучше все делать так, как подсказывает нормальная логика. Когда у вас есть отношение много-к-много, его сперва надо размножить, или как говорят - заселить - populate - и тогда уже на популяцию развешивать простые списки.

---------- Добавлено 12.06.2015 в 14:37 ----------

Да, и еще есть форум sql.ru и он-лайн фидлы для mysql.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий