Выбрать из того же столбца (возможно, из другой строки) в одном операторе выбора с помощью JOIN - PullRequest
1 голос
/ 24 марта 2011

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

Во-вторых, я сделал предложение select, которое возвращает то, что я хочу, но я не использую JOIN, и я хочу, если возможно, использовать JOIN, делать это и понимать его с помощью JOIN.

Допустим, у меня есть эти таблицы (упрощенно, потому что реальные таблицы больше):

products: 
fields: idproduct, name, idbaseunit; 
primary key: idproduct
foreign key: idbaseunit references units.idunit
-----------------------------------------------

units: 
fields: idunit, name
primary key: idunit
-----------------------------------------------

prodVSunit:
fields: idprodvsunit, idproduct, idunit, timesbaseunit, cost
primary key: idprodvsunit
foreign key: idproduct references products.idproduct
foreing key: idunit references units.idunit
-----------------------------------------------

Поведение таково, что я могу иметь разные единицы для одного и того же продукта, которые являются кратными базового блока, но стоимость не является относительной, как кратные. Мой английский не очень хорош, я не знаю, хорошо ли это объяснено, вот пример:

Если я зарегистрирую рис в качестве продукта и унцию в качестве базовой единицы для него, у меня может быть фунт (= 16 унций) в качестве единицы. Если я продам его за унцию за унцию, цена может отличаться от продажи за фунт, скажем, 1 доллар за унцию, 15,45 доллара за фунт.

В базе данных это выглядит так:

insert into units(`idunit`, `name`) values(1,'ounce')
insert into units(`idunit`, `name`) values(2,'pound')

insert into products(`idproduct`, `name`, `idbaseunit`) values(1,'rice',1)
insert into products(`idproduct`, `name`, `idbaseunit`) values(2,'sugar',1)

insert into prodVSunit(`idprodvsunit`, `idproduct`, `idunit`, `timesbaseunit`, `cost`) values(1,1,1,1,1.00)
insert into prodVSunit(`idprodvsunit`, `idproduct`, `idunit`, `timesbaseunit`, `cost`) values(2,1,2,16,15.45)
insert into prodVSunit(`idprodvsunit`, `idproduct`, `idunit`, `timesbaseunit`, `cost`) values(3,2,1,1,0.85)

Если я выполню это утверждение, я получу то, что хочу:

select pro.name as product, un.name as unit, pvu.timesbaseunit as 'times base unit', 
aux.name as 'base unit', pvu.cost
from units un, prodVSunit pvu, products pro,
(select prod.idproduct, prod.idbaseunit, unt.name from products prod, units unt
where prod.idbaseunit = unt.idunit) as aux  
where aux.idproduct = pvu.idproduct and pvu.idproduct = pro.idproduct and pvu.idunit = un.idunit

Запрос возвращает:

-------------------------------------------------------------------
product______|unit______|times base unit_|base unit_____|cost_
-------------------------------------------------------------------
rice_________|ounce_____|1_______________|ounce_________|1_________
rice_________|pound_____|16______________|ounce_________|15.45_____
sugar________|ounce_____|1_______________|ounce_________|0.85______

Обратите внимание, что (в результате) 'unit' и 'base unit' взяты из одного столбца таблицы, но иногда из другой строки.

Пока все хорошо, но я не могу понять это с помощью JOINs, это возможно ??? основная причина, по которой я хочу это с JOIN, заключается в том, что с 2-мя вложенными запросами все в порядке и легко, но если у меня будет 7 или 8 таких отношений, это будет беспорядок

Пожалуйста, прости меня за длинный пост и заранее спасибо.

1 Ответ

1 голос
/ 24 марта 2011

Вам просто нужно присоединиться к таблице единиц измерения дважды.

Я переписал ваш запрос с использованием объединений ANSI, чтобы сделать его более читабельным, а затем заменил qub-запрос вторым соединением для единиц измерения:

select pro.name as product, un.name as unit, pvu.timesbaseunit as 'times base unit', 
  baseUnit.name as 'base unit', pvu.cost
from prodVSunit pvu
  inner join units un on pvu.idunit = un.idunit
  inner join products pro on pvu.idproduct = pro.idproduct
  inner join units baseUnit on pro.idbaseunit = baseUnit.idunit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...