Сначала я искал и нашел похожие вопросы, но ни один не выглядит так, как мне нужно.
Во-вторых, я сделал предложение 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 таких отношений, это будет беспорядок
Пожалуйста, прости меня за длинный пост и заранее спасибо.