SELECT UNION и JOIN из двух таблиц со столбцом varchar вместо int

В базе данных "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 рядов?

jarlh 05.05.2022 12:51

Да, может быть 5-рядный результат.

willhelm2 05.05.2022 12:51

Может быть? При наличии данных таблицы?

jarlh 05.05.2022 12:52

В таблицах примеров, которые я написал, всего 2 строки данных. Но в таблицах гораздо больше строк данных, поэтому я указал ограничение результатов 5 строками: LIMIT 5; Но в этом примере ограничение может быть 2 строки.

willhelm2 05.05.2022 13:38

Разве 'prodbase'.'Products'.'productsupplierID' AS 'Supplier' не написано специально, чтобы дать вам productsupplierID как Supplier? Если вы присоединитесь к столовым продуктам на поставщике столов на productsupplierID = supplierid, затем выберите suppliername в качестве поставщика, вы должны получить то, что хотите.

Altimus Prime 05.05.2022 16:02
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
5
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть несколько проблем, которые вам нужно решить, чтобы данные возвращались так, как вы хотите. Во-первых, я не думаю, что вам нужен СОЮЗ здесь. 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 05.05.2022 20:41

@ willhelm2 - Да, я удалил таблицу «Распродажа». Связь между продуктом и поставщиком объединяется в нижнем запросе. Я до сих пор не знаю, как персонал здесь занимает свое место.

Ross Bush 06.05.2022 00:37

Staff — это просто случайно нужная таблица, но поскольку с ней нет отношений, это не важно. Этот новый отредактированный код работает хорошо. Благодарю вас!

willhelm2 06.05.2022 09:33

Другие вопросы по теме