Откуда взялись эти люди в этой таблице SQL?

#mysql #sql #database

Вопрос:

Здравствуйте, если кто-нибудь может посоветовать мне по этому поводу, пожалуйста, потому что я застрял на некоторое время. Я должен показать людей, которые были в местоположении с идентификатором 1 на определенную дату, в зависимости от того, совершили они транзакцию или нет, как от сотрудников, так и от клиентов. При проверке данных вручную задействовано только 2 транзакции и 3 человека:

 SELECT * FROM CS_store.Transactions
WHERE date = '2021-09-07' AND l_id = 1;
 

Таблица

Но когда я писал свой код, куча людей, я понятия не имею, откуда они пришли, утверждают, что соответствуют всем критериям. Почему?:

 CREATE VIEW PeopleInShop AS 
SELECT e.birth_day, e.first_name, e.last_name, t.date, l.l_id
FROM Employees e,Customers c, Transactions t , Locations l
WHERE l.l_id = 1 AND t.date = '2021-09-07'
UNION
SELECT c.birth_day, c.first_name, c.last_name, t.date, l.l_id
FROM Employees e, Customers c , Transactions t , Locations l
WHERE l.l_id = 1 AND t.date = '2021-09-07' ;

SELECT * FROM PeopleInShop;
 

Результат 2

Спасибо

Комментарии:

1. Вы знаете, что это: Employees e,Customers c, Transactions t , Locations l означает?

2. @forpas Я знаю, что это способ сократить столбец. Сотрудники в e и так далее

3. @CyberWTF если вы объединяете 2 таблицы, вам нужно указать MySQL, к каким полям присоединяться. Узнайте о JOIN и ON

4. Прочитайте о соединениях: mysqltutorial.org/mysql-join

5. Если вы FROM Employees e,Customers c, Transactions t , Locations l Вы выполняете ПОЛНОЕ ОБЪЕДИНЕНИЕ, в вашем случае без ограничений по связыванию, посмотрите его, это объяснит, почему у вас оооочень много возвращенных результатов

Ответ №1:

Вам нужно объединить таблицы вместе, иначе вы получите декартово произведение всех ваших таблиц. Я должен был угадать некоторые из ваших столбцов, но что-то вроде этого должно сработать:

 CREATE VIEW PeopleInShop AS 
SELECT e.birth_day, e.first_name, e.last_name, t.date, l.l_id
FROM Employees e,Transactions t , Locations l
WHERE l.l_id = 1 AND t.date = '2021-09-07'
AND t.e_id = e.e_id AND t.l_id = l.l_id
UNION
SELECT c.birth_day, c.first_name, c.last_name, t.date, l.l_id
FROM Customers c , Transactions t , Locations l
WHERE l.l_id = 1 AND t.date = '2021-09-07' 
AND t.c_id = c.c_id AND t.l_id = l.l_id ;

SELECT * FROM PeopleInShop;
 

На самом деле, если я правильно угадал ваши столбцы, вам вообще не нужна таблица местоположений, поскольку в вашей таблице транзакций идентификатор местоположения будет использоваться в качестве внешнего ключа:

 CREATE VIEW PeopleInShop AS 
SELECT e.birth_day, e.first_name, e.last_name, t.date, t.l_id
FROM Employees e,Transactions t
WHERE t.l_id = 1 AND t.date = '2021-09-07'
AND t.e_id = e.e_id
UNION
SELECT c.birth_day, c.first_name, c.last_name, t.date, t.l_id
FROM Customers c , Transactions t 
WHERE t.l_id = 1 AND t.date = '2021-09-07' 
AND t.c_id = c.c_id ;