2010-09-07 93 views
2

我有一個查詢:MySQL的左連接升

SELECT reply.id, 
      reply.message, 
      reply.userid, 
      reply.date, 
      medal.id, 
      medal.url, 
      medal.name, 
      user.id, 
      user.name AS username 
    FROM posts AS reply 
LEFT JOIN users AS user ON reply.userid = user.id 
LEFT JOIN medals AS medal ON medal.userid = user.id 
GROUP BY reply.id 
ORDER BY reply.id ASC 

一切正常,除了我拿到金牌升不降 這意味着它搶了先獎牌用戶得到 - 我需要得到最後一個

+1

你怎麼/我們知道金牌是最新的一個? – 2010-09-07 03:43:55

+0

問題是它爲什麼會按升序排列 – Wiika 2010-09-07 03:50:36

+0

您的查詢命令按照'reply.id'值的升序排列 - 我們對您的數據或表結構一無所知,但您的最終陳述包括「獲取第一枚獎牌,用戶得到了 - 我需要得到最後一個。「在上下文中,這意味着你想要最新的獎牌... – 2010-09-07 03:53:28

回答

0

你也許可以爲獎牌製作子查詢或臨時表,而不是直接加入獎牌。臨時表將是獎牌表,但排序DESC。子查詢將是LEFT JOIN(通過desc選擇id,url,medals排序中的名稱),但我覺得這樣會很慢,而不是最好的選擇。

0

最簡單的辦法是做這樣的:

ORDER BY reply.id ASC, medal.id DESC 

刪除您GROUP BY聲明。

您可以篩選職位誰擁有多個獎牌事後/用戶(跳過含有你不想獎牌行)。

下一個選項是在子查詢中選擇MAX(medal.id),然後對加盟。這會變得混亂,但是可行。這是一般的想法(你可能要重新命名幾個表的別名,因爲它們使用一次以上):

SELECT *, 
     medal.url, 
     medal.name 
FROM 
(
    SELECT reply.id, 
      reply.message, 
      reply.userid, 
      reply.date, 
      MAX(medal.id) AS medal_id, 
      user.id, 
      user.name AS username 
    FROM posts AS reply 
LEFT JOIN users AS user ON reply.userid = user.id 
LEFT JOIN medals AS medal ON medal.userid = user.id 
GROUP BY reply.id 
ORDER BY reply.id ASC 
) 
AS t 
LEFT JOIN medals AS medal ON medal.id = t.medal_id 
+0

子查詢將是一個很好的選擇我現在,我加入超過3表,我沒有嘗試,(SELECT ID FROM medals WHERE userid = user。 ID ORDER BY id DESC LIMI 1)AS m_id然後加入ON medal.id = m_id ut太慢 – Wiika 2010-09-07 05:31:20

+0

是的,你不想這樣做,它會運行'N + 1'查詢。通過這條路線,你基本上只需要運行兩個查詢,一個從臨時表中刪除......它並不完美,但我認爲這是最好的選擇。 – wuputah 2010-09-07 15:25:14

1

您看到每個組的第一個記錄的事實是偶然的。在GROUP BY查詢中選擇非聚合,非組唯一列會導致未選定的記錄被選中。

對於更詳細的解釋如下:​​。做你在做什麼

一個正確的方法是使用子查詢,在其中選擇所需的每個組的最大金牌日期。

這種方法這裏概述:http://dev.mysql.com/doc/refman/5.6/en/example-maximum-column-group-row.html