#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;
Спасибо
Комментарии:
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 ;