Оператор Mysql (синтаксическая ошибка в FULL JOIN) - PullRequest
3 голосов
/ 25 января 2011

Что не так с моим SQL-заявлением, оно говорит, что проблема близка к ПОЛНОМУ СОЕДИНЕНИЮ, но я озадачен:

SELECT `o`.`name` AS `offername`, `m`.`name` AS `merchantName` 
FROM `offer` AS `o` 
FULL JOIN `offerorder` AS `of` ON of.offerId = o.id 
INNER JOIN `merchant` AS `m` ON o.merchantId = m.id 
GROUP BY `of`.`merchantId` 

Пожалуйста, будьте осторожны, поскольку я не являюсь sql fundi

1 Ответ

3 голосов
/ 26 января 2011

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?Если это так, измените ЛЕВЫЙ на ПРАВОЕ соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...