2011-01-25 34 views
3

有什麼不對我的SQL語句,它說,這個問題是附近的FULL JOIN,但我很爲難:Mysql的聲明(關於完整的語法錯誤JOIN)

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眼底

+2

fundi =「中空器官的基部或距離其開口最遠的器官的部分」 – VoodooChild

+3

MySQL不支持完整連接,請參閱http://stackoverflow.com/questions/2384298/mysql-full-outer -join-syntax-error/2384312#2384312 – BoltClock

+0

+1 @VoodooChild我也被這個詞卡住了。 :P @BoltClock +1鏈接 – Nishant

回答

3

MySQL不提供全面的加入,您可以使用

  • 一對左+右和聯盟;或
  • 使用左,右和內,UNION ALL

查詢也是非常錯誤的三元組,因爲你有一個GROUP BY但你的SELECT列不是聚集。

在您正確地將其轉換爲LEFT + RIGHT + UNION之後,仍然存在從每個不同of.merchantid的任意隨機記錄獲取要約名和商家名的問題,甚至不一定來自同一記錄。

因爲你有一個INNER JOIN條件對o.merchant,充分JOIN是沒有必要的,因爲"offerorder"記錄在"offer"不匹配將失敗的INNER JOIN。這將它變成一個LEFT JOIN(可選)。由於您在of.merchantid上進行分組,因此任何缺少的offerorder記錄將作爲商家在「NULL」下分組在一起。

這是一個可以工作的查詢,對於每個商戶,它只顯示商家提供的一個商品(按照字典順序排序時的第一個商品)。

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?如果是這種情況,請將LEFT更改爲RIGHT連接。

+0

既然何時是一個答案只是一個問題的OP負載澄清?這是一條評論,而不是一個答案。 –

+0

@OMG我沒有看到任何問號 - 「你能指出他們嗎?我指出了SQL中的缺陷,以幫助提問者學習SQL。 – RichardTheKiwi

+0

討論但沒有例子== OP問題「我該怎麼做?」如果你不回答,社區會適當地對待你。 –