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 :(

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