2013-02-16 79 views
1

需要一些幫助來找到從這種查詢中有效獲得結果的最佳方式,我有一個消息表,並且這個消息表對每個消息都有評論。我需要檢索每條消息和每條隨後的消息評論。起初我想要抓住所有的消息和他們的PK,然後在一個循環內使用它來獲得評論,但我想知道是否有更有效的方法來做到這一點。我希望顯示每條消息以及該消息的所有後續註釋。 Message1 - >所有評論Message2 - >所有評論。 這是我怎麼想輸出到像一個例子:循環中的子查詢

eg. Work Site Maintenance. //Message 
       At 1pm   //comments 
       At 2pm   //comments 
       At 3pm   //comments 
     Work Site Offline. 
       Foundation work 
       Layng blocks 
       Placing steel 

我目前的查詢來獲取信息的列表,但每個

SELECT MS.status_id, 
     MS.member_id, 
     MS.status_text, 
     MS.status_time 
    FROM message_status MS 
    WHERE MS.member_id = memberId //variable 
    ORDER BY MS.status_id DESC 
    LIMIT 20 


**message_status** 
status_id PK 
member_id 
status_text 
status_time 

**comments_status** 
status_id FK 
member_id FK 
comm_text 
comm_time 
+0

所以'工作網站Maintenance'部分應是預期的結果? – scones 2013-02-16 13:23:27

+0

是否正確,是否希望以該格式顯示,然後選擇工作站點維護與此消息關聯的註釋。 – kabuto178 2013-02-16 13:25:11

+0

評論和消息如何相關?從你上面的結構來看,似乎並不是。 – Kermit 2013-02-16 13:34:36

回答

2

沒有意見,我想你可以加入他們的行列得到你想要的結果。

SELECT MS.status_id, 
    MS.member_id, 
    MS.status_text, 
    MS.status_time, 
    CS.comm_text, 
    CS.comm_time 
FROM message_status MS 
    left join comments_status CS on CS.status_id = MS.status_id 
WHERE MS.member_id = memberId //variable 
ORDER BY MS.status_id DESC, CS.comm_time DESC 
LIMIT 20 
+0

我建議左側加入評論,以防某些消息沒有。 – 2013-02-16 13:36:07

+0

良好的通話,修復。 – wtjones 2013-02-16 13:36:43

+0

現在就試試看,感謝看 – kabuto178 2013-02-16 13:48:01

0

的最優選擇是讓所有的數據在一個往返與加盟相對於往返的開銷,很多情況下數據量較小。

沒有使用上下文,你可以爭論這種方式。

要看的東西是。

您是否總是想要獲取所有數據?

在你做下一件事情之前,你是否需要所有的數據?

往返旅程的費用是多少?

獲得這一切的成本是多少?

緩存數據一旦你有(例如延遲加載是有用的)。你需要猜測數據是多麼的不穩定,也就是說。緩存過期的可能性有多大,請記住一次獲取所有數據是一個很大的緩存。

這很可能是你可能選擇效率低下來說的UI響應。考慮填寫客戶名稱的組合,然後在選擇時顯示其屬性。 但是如果是一個網頁,即使有類似ajax的東西往返也可能會很痛苦。

那麼總之,高效什麼?

+0

感謝您的洞察力,這些數據將會每天更新,並且會員會在一天中多次訪問。在請求時,消息必須顯示相關的註釋。如果需要進行額外的更改,獲取此數據可能會阻止繼續執行步驟。不確定費用,但文本字段是(VARCHAR 180) – kabuto178 2013-02-16 14:06:04

1

如何使用LEFT JOIN

SELECT MS.status_id, 
     MS.member_id, 
     MS.status_text, 
     CS.comm_text, 
     MS.status_time 
    FROM message_status MS 
    LEFT JOIN (SELECT * FROM comments_status) AS CS 
    USING (status_id,member_id) 
    WHERE MS.member_id = memberId //variable 
    ORDER BY MS.status_id DESC 
    LIMIT 20; 

而且,索引的WHERE和JOIN子句應加快SELECT查詢(但減慢INSERT列,因此,如果您執行這是一個權衡唯一值得這個查詢經常):

CREATE INDEX m_id ON message_status (member_id); 
CREATE INDEX sm_id ON message_status (status_id,member_id); 
CREATE INDEX sm_id ON comments_status (status_id,member_id); 

例子:http://sqlfiddle.com/#!2/565f9/1