В базе данных "prodbase" у меня есть три таблицы:
Настольные продукты
|id | productname | productprice | productsupplierID (int11) |
+----+-------------+-----------------+----------------------------+
| 1 | Shirt | 20 | 3 |
| 2 | Tshirt | 25 | 5 |
Поставщик столов
|supplierid (int11) | suppliername (varchar) |
+--------------------+------------------------+
| 3 | CompanyA |
| 5 | CompanyB |
Стол Персонал
|id | staffname | staffposition |
+----+-------------+-------------------+
| 1 | John | sales |
| 2 | Megan | accounting |
В таблице «Продукты» используется поле поиска из таблицы «Поставщик»: supplierID.
Я создал базу данных View для таблицы Union Products и Staff. со следующим запросом.
SELECT 'prodbase'.'Products'.'productname' AS 'Product', 'prodbase'.'Products'.'productsupplierID' AS 'Supplier' FROM 'prodbase'.'Products'
UNION
SELECT 'prodbase'.'Staff'.'staffname' AS 'Staff', 'prodbase'.'Staff'.'staffposition' AS 'Position' FROM 'prodbase'.'Staff'
ORDER BY 'Supplier'
DESC LIMIT 5;
Запрос работает, но в столбце Поставщик отображается номер (ID).
Product: Shirt
Staff: John
Position: sales
Supplier: 3
Как создать этот запрос UNION с JOIN, чтобы он отображал имя поставщика вместо идентификатора поставщика? пример желаемого результата:
Product: Shirt
Staff: John
Position: sales
Supplier: CompanyA
Да, может быть 5-рядный результат.
Может быть? При наличии данных таблицы?
В таблицах примеров, которые я написал, всего 2 строки данных. Но в таблицах гораздо больше строк данных, поэтому я указал ограничение результатов 5 строками: LIMIT 5; Но в этом примере ограничение может быть 2 строки.
Разве 'prodbase'.'Products'.'productsupplierID' AS 'Supplier'
не написано специально, чтобы дать вам productsupplierID
как Supplier
? Если вы присоединитесь к столовым продуктам на поставщике столов на productsupplierID = supplierid
, затем выберите suppliername
в качестве поставщика, вы должны получить то, что хотите.
Есть несколько проблем, которые вам нужно решить, чтобы данные возвращались так, как вы хотите. Во-первых, я не думаю, что вам нужен СОЮЗ здесь. UNION — это когда вы хотите объединить несколько запросов в один. Я думаю, вам просто нужно использовать INNER JOIN для ваших данных, чтобы получить желаемый результат. Говоря об отношениях, вы упускаете один важный момент. Между персоналом, продуктом и поставщиком нет никакой связи, поэтому невозможно обеспечить желаемый результат, если вы не включите таблицу отношений. Я создал пример мыслимой таблицы взаимосвязей под названием «Продажа», которая связывает персонал с проданным продуктом. Это не идеальный пример, но он позволит вам работать с данными. С помощью таблицы отношений вы можете INNER JOIN получить все продукты, проданные сотрудниками, в этом простом примере.
CREATE TABLE Products(id INT, productname VARCHAR(50), productprice int, productsupplierID int); CREATE TABLE Supplier(supplierid INT, suppliername VARCHAR(50)); CREATE TABLE Staff(id INT, staffname VARCHAR(50),staffposition VARCHAR(50)); CREATE TABLE Sale(staffid INT, productId INT); INSERT INTO Products VALUES(1,'Shirt',20,3),(2,'Tshirt',25,5); INSERT INTO Supplier VALUES(3,'CompanyA'),(5,'CompanyB'); INSERT INTO Staff VALUES(1,'John','Sales'),(2,'Megan','Accounting'); INSERT INTO Sale VALUES(1,1);
SELECT Products.productname AS Product, Staff.staffname AS Staff, Staff.staffposition AS Position, Products.productprice AS Price, Supplier.suppliername AS Supplier FROM Sale INNER JOIN Products ON Products.id=Sale.productId INNER JOIN Supplier ON Supplier.supplierid=Products.productsupplierID INNER JOIN Staff ON Staff.id = Sale.staffid
Product | Staff | Position | Price | Supplier :------ | :---- | :------- | ----: | :------- Shirt | John | Sales | 20 | CompanyA
дб <> рабочий пример здесь
Отредактировано - я удалил "Распродажу" на основе комментария. Я предполагаю, что вы могли бы перекрестно присоединиться к персоналу, однако без связи между продуктом/поставщиком и персоналом нет логического способа наложить эти данные на него.
SELECT
Products.productname AS Product,
Products.productprice AS Price,
Supplier.suppliername AS Supplier
FROM
Products
INNER JOIN Supplier ON Supplier.supplierid=Products.productsupplierID
Можно ли это сделать без создания таблицы Sale? productprice int в таблице Продукты могут быть удалены. Однако этот запрос создает ТОЛЬКО ОДНУ строку записи, а их должно быть ДВЕ.
@ willhelm2 - Да, я удалил таблицу «Распродажа». Связь между продуктом и поставщиком объединяется в нижнем запросе. Я до сих пор не знаю, как персонал здесь занимает свое место.
Staff — это просто случайно нужная таблица, но поскольку с ней нет отношений, это не важно. Этот новый отредактированный код работает хорошо. Благодарю вас!
Вы хотите результат в 5 рядов?