MySQL « Вертикальное объединение таблиц
Если с горизонтальным объединением все понятно, то как быть в вертикальным.
Упрощенная ситуация со структурой таблиц следующая
Catalog Таблица рубрик
ID Int
Name Text
Product Таблица продуктов
ID Int
Name Text
Price Int
CatalogID - связь с Catalog
VirtualProduct Таблица виртуальных продуктов
ID Int
CatalogID - связь с Catalog
ProductID - связь с Product
Хочется получить все товары рубрики одним запросом и чтобы при этом удобно было сортировать по названию и/или цене.
UPD:
VirtualProduct и Product вполне себе самостоятельные данные используемые в большинстве случаев без связей, но потребовалось к сожалению на сортировке по обоим.
Приведу примерный запрос, какие данные хотелось бы получить:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .mysql.geshi_code {font-family:monospace;} .mysql.geshi_code .imp {font-weight: bold; color: red;} .mysql.geshi_code .kw1 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw2 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw3 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw4 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw5 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw6 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw7 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw8 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw9 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw10 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw11 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw12 {color: #009900;} .mysql.geshi_code .kw13 {color: #000099;} .mysql.geshi_code .kw14 {color: #000099;} .mysql.geshi_code .kw15 {color: #000099;} .mysql.geshi_code .kw16 {color: #000099;} .mysql.geshi_code .kw17 {color: #000099;} .mysql.geshi_code .kw18 {color: #000099;} .mysql.geshi_code .kw19 {color: #000099;} .mysql.geshi_code .kw20 {color: #000099;} .mysql.geshi_code .kw21 {color: #000099;} .mysql.geshi_code .kw22 {color: #000099;} .mysql.geshi_code .kw23 {color: #000099;} .mysql.geshi_code .kw24 {color: #000099;} .mysql.geshi_code .kw25 {color: #000099;} .mysql.geshi_code .kw26 {color: #000099;} .mysql.geshi_code .kw27 {color: #00CC00;} .mysql.geshi_code .coMULTI {color: #808000; font-style: italic;} .mysql.geshi_code .co1 {color: #808080; font-style: italic;} .mysql.geshi_code .co2 {color: #808080; font-style: italic;} .mysql.geshi_code .es0 {color: #004000; font-weight: bold;} .mysql.geshi_code .es1 {color: #008080; font-weight: bold;} .mysql.geshi_code .br0 {color: #FF00FF;} .mysql.geshi_code .sy1 {color: #CC0099;} .mysql.geshi_code .sy2 {color: #000033;} .mysql.geshi_code .st0 {color: #008000;} .mysql.geshi_code .nu0 {color: #008080;} .mysql.geshi_code span.xtra { display:block; }
SELECT * FROM Product WHERE CatalogID = {id} OR Product.ID IN (SELECT VirtualProduct.ProductID FROM VirtualProduct WHERE VirtualProduct.CatalogID = {id}) ...
может запрос и с ошибками, но такой вариант ну никак не подходит из-за вложенного select :(
Упрощенная ситуация со структурой таблиц следующая
Catalog Таблица рубрик
ID Int
Name Text
Product Таблица продуктов
ID Int
Name Text
Price Int
CatalogID - связь с Catalog
VirtualProduct Таблица виртуальных продуктов
ID Int
CatalogID - связь с Catalog
ProductID - связь с Product
Хочется получить все товары рубрики одним запросом и чтобы при этом удобно было сортировать по названию и/или цене.
UPD:
VirtualProduct и Product вполне себе самостоятельные данные используемые в большинстве случаев без связей, но потребовалось к сожалению на сортировке по обоим.
Приведу примерный запрос, какие данные хотелось бы получить:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .mysql.geshi_code {font-family:monospace;} .mysql.geshi_code .imp {font-weight: bold; color: red;} .mysql.geshi_code .kw1 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw2 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw3 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw4 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw5 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw6 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw7 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw8 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw9 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw10 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw11 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw12 {color: #009900;} .mysql.geshi_code .kw13 {color: #000099;} .mysql.geshi_code .kw14 {color: #000099;} .mysql.geshi_code .kw15 {color: #000099;} .mysql.geshi_code .kw16 {color: #000099;} .mysql.geshi_code .kw17 {color: #000099;} .mysql.geshi_code .kw18 {color: #000099;} .mysql.geshi_code .kw19 {color: #000099;} .mysql.geshi_code .kw20 {color: #000099;} .mysql.geshi_code .kw21 {color: #000099;} .mysql.geshi_code .kw22 {color: #000099;} .mysql.geshi_code .kw23 {color: #000099;} .mysql.geshi_code .kw24 {color: #000099;} .mysql.geshi_code .kw25 {color: #000099;} .mysql.geshi_code .kw26 {color: #000099;} .mysql.geshi_code .kw27 {color: #00CC00;} .mysql.geshi_code .coMULTI {color: #808000; font-style: italic;} .mysql.geshi_code .co1 {color: #808080; font-style: italic;} .mysql.geshi_code .co2 {color: #808080; font-style: italic;} .mysql.geshi_code .es0 {color: #004000; font-weight: bold;} .mysql.geshi_code .es1 {color: #008080; font-weight: bold;} .mysql.geshi_code .br0 {color: #FF00FF;} .mysql.geshi_code .sy1 {color: #CC0099;} .mysql.geshi_code .sy2 {color: #000033;} .mysql.geshi_code .st0 {color: #008000;} .mysql.geshi_code .nu0 {color: #008080;} .mysql.geshi_code span.xtra { display:block; }
SELECT * FROM Product WHERE CatalogID = {id} OR Product.ID IN (SELECT VirtualProduct.ProductID FROM VirtualProduct WHERE VirtualProduct.CatalogID = {id}) ...
может запрос и с ошибками, но такой вариант ну никак не подходит из-за вложенного select :(
1 ответов
(
select p1.Name product_name, p1.Price product_price, c1.Name catalog_name from Product p1 left join Catalog c1 on p1.CatalogID = c1.ID
) union (
select p2.Name product_name, p2.Price product_price, c2.Name catalog_name from VirtualProduct vp left join Product p2 on vp.ProductID = p2.ID left join CatalogID c2 on c2.ID = vp.CatelogID
) order by product_price desc;
В общем как-то так, если ошибся, поправят...
А ещё можно сделать
create view VirtualProductView as select p.* from VirtualProduct vp on vp.ProductID = p.ID;
И работать с вьюхой так как будь-то это аналогичная таблица Product.
зачем нам в Product связь с Catalog, если мы все знаем о принадлежности товаров к рубрикам по VirtualProduct?
или зачем нам вся таблица VirtualProduct, если мы знаем о принадлежности товаров к рубрикам по CatalogID в Product.
Избыточность??
Или очень просто, или вопрос не ясен.
С учетом схемы в апдейте вопроса:
SELECT Product.*
FROM Product
JOIN
VirtualProduct
ON Product.ID = VirtualProduct.ProductID
WHERE Product.CatalogID = {id}
OR VirtualProduct.CatalogID = {id}
Если искать надо по названию рубрики Catalog.Name, надо будет добавить дополнительный джоин с каталогом:
SELECT Product.*
FROM Product
JOIN VirtualProduct
ON Product.ID = VirtualProduct.ProductID
JOIN Catalog
ON (Product.CatalogID = Catalog.ID
OR VirtualProduct.CatalogID = Catalog.ID)
WHERE Catalog.Name = 'имя_рубрики'
Зачем изобретать велосипед? Если из кода передаётся идентификатор рубрики, то пишите простейший запрос без всяких JOIN.
SELECT
p.ID,
p.Name,
p.Price
FROM
Product p
WHERE
p.CatalogID = 1
ORDER BY
p.Price