MySQL не предлагает полное соединение, вы можете использовать
- пару LEFT + RIGHT и UNION;или
- используйте триплет LEFT, RIGHT и INNER и UNION ALL
Запрос также очень неправильный, поскольку у вас есть GROUP BY, но столбцы SELECT не являются агрегатами.
После правильного преобразования этого значения в LEFT + RIGHT + UNION у вас все еще остается проблема получения имени предложения и имени продавца из любой случайной записи для каждого отдельного of.merchantid
и даже не обязательно из той же записи.
Поскольку у вас есть условие INNER JOIN для o.merchant, FULL JOIN не требуется, поскольку записи "offerorder"
без совпадений в "offer"
завершат INNER JOIN.Это превращает его в левое соединение (необязательно).Поскольку вы группируете по of.merchantid
, все пропущенные записи offerorder
будут сгруппированы в "NULL" как merchantid.
Этот запрос будет работать, для каждого продавца будет отображаться только одно предложение.сделанный продавцом (тот, чье имя было отсортировано в лексикографическом порядке).
SELECT MIN(o.name) AS offername, m.name AS merchantName
FROM offer AS o
LEFT JOIN offerorder AS `of` ON `of`.offerId = o.id
INNER JOIN merchant AS m ON o.merchantId = m.id
GROUP BY `of`.merchantId, m.name
Примечание: соединение o.merchantid = m.id
весьма подозрительно.Вы имели в виду of.merchantid = m.id
?Если это так, измените ЛЕВЫЙ на ПРАВОЕ соединение.