2014-08-28 72 views
0

這應該是發佈給他們的新附件的主題列表。查詢不工作需要在groupby之前orderby?

此查詢中的group by未按我的意願工作。 (它是SMF。) 它應該從每個具有最新附件的線程中提取一個代表性附件 - 不僅僅是新線程,而是任何線程。結果將是一個鏈接到相應新圖像發佈的線索的縮略圖。

相反,它不起作用。目前它有兩個問題。第一個問題是它顯示線程中的第一個附件,而不是最近的附件。第二個問題是它通過線程創建日期進行排序。我希望附件創建日期成爲訂單,並根據哪些線程具有最新附件對線程列表進行排序。因此,即使有最近的附件,舊線程也不會升至頂端。我需要先選擇一個子選擇嗎?我該如何做這項工作?

非常感謝你提前。

SELECT * 
FROM smf_attachments AS att 
    INNER JOIN smf_messages AS m ON (m.id_msg = att.id_msg) 
    INNER JOIN smf_topics AS t ON (t.id_topic = m.id_topic) 
    LEFT JOIN smf_members AS mem ON (mem.id_member = m.id_member) 
    LEFT JOIN smf_attachments AS thumb ON (thumb.id_attach = att.id_thumb) 
WHERE att.attachment_type = 0 
    AND t.id_board = 3 

GROUP BY t.id_topic   
ORDER BY att.id_attach DESC 
LIMIT 2 

(編輯。)

假設我們有三個topic_id每5個附件。較高的附件編號意味着它是一個較新的附件,而較高的附件編號意味着它是一個較新的主題。

topic_id 1|attachment 3,6,13,14,15 
topic_id 2|attachment 1,2,4,5,12 
topic_id 3|attachment 7,8,9,10,11 

在上述情況下,查詢應該拉2條(限2):

topic_id attachment 
-------- ---------- 
1   15 
2   12 

因爲我只希望每個主題1個附件,2個主題與最新的附件是話題1和2(分別附件15和12)。儘管主題3更近,但在這種情況下它不會是一個結果,因爲它的附件比較老。

(編輯。)

我試圖通過systemmatrix所提供的解決方案,但它仍然通過topic_id創建日期,而不是其主題包含最新的附件排序。我試圖讓上面的問題更清楚。任何幫助?先謝謝你。

(編輯) 我現在看到它按照每個主題中第一個附件的日期進行排序。主題由最近的第一個附件。我需要使用最新附件或上次附件的主題

編輯 我做了一個更改,它提供了正確的主題列表。這是新的代碼。

  SELECT att.id_thumb, att.id_msg, att.attachment_type, att.id_attach, distinct on (t.id_topic) 
      FROM smf_attachments AS att 
       INNER JOIN smf_messages AS m ON (m.id_msg = att.id_msg) 
       INNER JOIN smf_topics AS t ON (t.id_topic = m.id_topic) 
       LEFT JOIN smf_members AS mem ON (mem.id_member = m.id_member) 
       LEFT JOIN smf_attachments AS thumb ON (thumb.id_attach = att.id_thumb) 
      WHERE att.attachment_type = 0 
       AND t.id_board = 3 


      ORDER BY max(att.id_attach) DESC 
      LIMIT 2 

現在唯一的問題是我如何才能讓它顯示正確的縮略圖附件?它仍然在各自的主題中顯示第一個附件,而不是最後一個。任何幫助? 預先感謝您。

+0

工作在MySQL或SQL? – 2014-08-28 04:56:42

+0

嘿約翰遜賈森,我已經介紹了一個,相當長的鏡頭,猜測我的編輯(SMF是簡單論壇機器),請你驗證一下(或者看看我對你的帖子做了什麼)?根據需要隨意編輯/回滾。 – 2014-08-28 06:22:39

+2

無論如何,這看起來像是一個典型的最大的N組問題,並且我已經添加了相應的標籤來對您的問題進行分類。你可以看看[其他問題標籤爲'mysql' +'最大的每個組],(你可能會遇到這樣的問題)在其中的一些中找到你的解決方案。 – 2014-08-28 06:26:48

回答

1

如果這是唯一的3列,你需要每個主題

  • att.id_thumb
  • att.id_msg
  • ATT最近的記錄。attachment_type

您可以使用使用SUBSTRING_INDEX超過GROUP_CONCAT結果的伎倆想獲得最新的id_thumbid_attach訂購的話題,你可以寫你的id_thumb表達

SUBSTRING_INDEX(
GROUP_CONCAT(att.id_thumb ORDER BY att.id_attach DESC SEPARATOR '||'), 
'||',1) AS id_thumb 

  • GROUP_CONCAT(expr)

這將組合所有id_thumb s爲一個主題,併爲您提供 列表,由雙||或者你可以更改分隔符按照 您的需求在上面我使用||例如對於以上結果 函數將會像thumb1||thumb2||thumb3||thumb4這將是 按id_attach以降序排列。

的結果被截斷到由所述group_concat_max_len系統變量,它具有默認值的1024的值可以設定得更高 給出的最大長度,雖然有效最大 長度的返回值受限於max_allowed_pa​​cket的值 。


  • SUBSTRING_INDEX(STR,DELIM,計數)

從文檔返回計數之前從字符串str的子 出現的分隔符delim中的。如果計數爲正數,則返回最後一個分隔符左側(從左數起)的所有 爲 。如果計數爲負值,則返回最後一個 分隔符右邊的數字(從右數起)。 SUBSTRING_INDEX() 在搜索delim時執行區分大小寫的匹配。


現在你最終的查詢將類似於如下

SELECT 
SUBSTRING_INDEX(GROUP_CONCAT(att.id_thumb ORDER BY att.id_attach DESC SEPARATOR '||'),'||',1) AS id_thumb, 
SUBSTRING_INDEX(GROUP_CONCAT(att.id_msg ORDER BY att.id_attach DESC SEPARATOR '||'),'||',1) AS id_msg, 
SUBSTRING_INDEX(GROUP_CONCAT(att.attachment_type ORDER BY att.id_attach DESC SEPARATOR '||'),'||',1) AS attachment_type, 
MAX(att.id_attach) AS id_attach_max, 
t.id_topic 
FROM 
    smf_attachments AS att 
    INNER JOIN smf_messages AS m ON (m.id_msg = att.id_msg) 
    INNER JOIN smf_topics AS t ON (t.id_topic = m.id_topic) 
    LEFT JOIN smf_members AS mem ON (mem.id_member = m.id_member) 
    LEFT JOIN smf_attachments AS thumb ON (thumb.id_attach = att.id_thumb) 
WHERE att.attachment_type = 0 
    AND t.id_board = 3 
GROUP BY t.id_topic 
ORDER BY id_attach_max DESC 
LIMIT 2