два правых объединения выбирают в одном запросе mysql - PullRequest
0 голосов
/ 17 апреля 2020

Мне нужно объединить две таблицы, и каждая из них должна иметь общие отношения.

Одна таблица предназначена для "покупок", а другая - для "платежей", обе они напрямую связаны с таблицей "клиенты".

Я пробовал это, но это не работает.

SELECT c.id AS idclient, c.name AS nameclient, p.id AS idpayment, cp.id AS idpurchases 
            FROM clients AS c
                RIGHT JOIN payments AS p ON c.id = p.client
                RIGHT JOIN purchases AS cp ON c.id = cp.client

Таблицы имеют другую структуру и другие поля, которые в данный момент не нужны. В основном это те поля, которые находятся в списке выбора.

Ожидаемый результат:

Когда покупатель НЕ указан в таблицах "покупки" или "платежи", он не должен быть указан, за исключением логического предложения в таблице «закупки» (бизнес-правило компании).

idclient | nameclient | idpurchases | idpayment

109      | John       | 3           | NULL
27       | Code       | 1           | 1
302      | Woen       | 4           | NULL
NULL     | NULL       | 2           | NULL

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вы хотите объединить три таблицы, но покажете только клиентов, у которых есть запись хотя бы в одной из таблиц payments и purchases. Поэтому внешнее объедините эти таблицы и используйте условие where, чтобы убедиться, что хотя бы у одной из них есть совпадение.

SELECT c.id AS idclient, c.name AS nameclient, p.id AS idpayment, cp.id AS idpurchases 
FROM clients AS c
LEFT JOIN payments AS p ON p.client = c.id
LEFT JOIN purchases AS cp ON cp.client = c.id
WHERE (p.client IS NOT NULL OR cp.client IS NOT NULL);

Однако это странный запрос, поскольку структура таблицы предполагает, что может быть несколько платежей и несколько покупок на клиента, но ваш запрос объединяет каждый платеж с каждой покупкой, совершенной клиентом. Разве они не связаны между собой? Будет ли клиент сделать платеж, не купив ничего? Я хочу сказать, что, хотя вы и просили этот запрос, вы действительно можете захотеть совершенно другой.

1 голос
/ 17 апреля 2020

Насколько я вижу, вам нужно LEFT JOIN.
Это означает, что у вас есть клиенты без покупок и платежей.
Или клиент совершает покупку, но по-прежнему не платит
Нет покупок и платежей без клиента!

SELECT c.id AS idclient, c.name AS nameclient,
       p.id AS idpayment,
       cp.id AS idpurchases 
FROM clients AS c
LEFT JOIN payments AS p ON c.id = p.client
LEFT JOIN purchases AS cp ON c.id = cp.client


Возможный вывод
[idclient,name, idpay,idPur]
[1,A,2,3] - нормально
[2,B,null,4] - без оплаты: нормально
[3,C,null,null] - без покупки и оплаты: хорошо

или
используйте JOIN(inner) для получения без нуля [1,A,2,3]

SELECT c.id AS idclient, c.name AS nameclient,
       p.id AS idpayment,
       cp.id AS idpurchases 
FROM purchases AS cp
//left if wanted all record
//inner : now only all columns populated 
JOIN payments AS p ON cp.client = p.client
JOIN clients AS c ON c.id = cp.client  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...