2013-09-23 34 views
0

我問了一個以前的問題,在如何以zend框架的方式做到這一點,但沒有運氣,幫助我得到常規的mysql查詢。Mysql從每個組獲得最新的10個

我有表messagesmessage_idthread_idmessage

我有一個列表

$threads = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15";

我需要找到每個線程的最後10條信息。

我試圖沿

SELECT m2.* FROM messages m2 JOIN(SELECT * FROM messages)m ON m2.thread_id = m.thread_id WHERE m2.message_id IN ('$list') LIMIT 10 

線的東西,但在總限制10。

任何幫助將不勝感激,謝謝。


CREATE TABLE IF NOT EXISTS `messages` (
    `message_id` int(11) NOT NULL AUTO_INCREMENT, 
    `thread_id` int(11) NOT NULL, 
    `message` text NOT NULL, 
    PRIMARY KEY (`message_id`), 
    KEY `thread_id` (`thread_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

樣本數據:

INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (1,1,"tempor erat neque"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (101,1,"adipiscing non, luctus sit amet,"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (201,1,"fames"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (301,1,"odio. Phasellus"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (401,4,"Donec egestas. Aliquam nec enim. Nunc ut"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (501,3,"Aliquam tincidunt, nunc ac mattis ornare, lectus ante dictum mi,"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (601,5,"Fusce mollis. Duis sit amet diam eu dolor egestas rhoncus."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (701,2,"non, lacinia at, iaculis quis, pede. Praesent"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (801,6,"vehicula"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (901,2,"mollis nec, cursus a, enim. Suspendisse"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (1001,3,"urna. Nullam lobortis quam a felis ullamcorper"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (1101,2,"magna. Lorem ipsum dolor sit amet, consectetuer"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (1201,5,"erat nonummy ultricies ornare, elit elit fermentum risus,"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (1301,4,"mattis ornare, lectus ante dictum mi, ac mattis"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (1401,5,"justo. Proin non massa"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (1501,6,"leo, in lobortis tellus justo sit amet nulla."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (1601,5,"sit amet, dapibus id, blandit"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (1701,1,"cursus luctus, ipsum leo elementum sem, vitae aliquam"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (1801,4,"ac ipsum. Phasellus vitae mauris sit amet"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (1901,1,"nunc interdum feugiat. Sed nec metus facilisis lorem tristique aliquet."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (2001,2,"varius. Nam porttitor scelerisque neque."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (2101,4,"sollicitudin a, malesuada id, erat. Etiam vestibulum"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (2201,3,"Sed congue, elit sed"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (2301,2,"sagittis felis. Donec tempor, est ac mattis semper, dui lectus"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (2401,1,"ut aliquam iaculis, lacus pede sagittis augue,"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (2501,5,"at pretium aliquet, metus urna convallis"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (2601,3,"amet risus. Donec egestas."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (2701,6,"pede. Cras vulputate velit"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (2801,1,"mattis semper, dui lectus rutrum urna, nec luctus felis purus"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (2901,2,"nec"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (3001,1,"amet metus. Aliquam erat"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (3101,3,"justo."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (3201,3,"nec ante. Maecenas mi felis,"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (3301,1,"mi tempor lorem, eget mollis lectus pede"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (3401,4,"non, hendrerit id, ante. Nunc mauris sapien, cursus in,"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (3501,3,"ullamcorper magna. Sed eu eros. Nam consequat"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (3601,1,"in"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (3701,2,"Nam ac nulla. In tincidunt congue turpis. In condimentum."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (3801,1,"viverra. Donec tempus, lorem fringilla ornare placerat, orci lacus vestibulum"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (3901,4,"eget ipsum."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (4001,6,"tempor diam"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (4101,6,"turpis non enim. Mauris quis turpis"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (4201,3,"ac facilisis facilisis, magna tellus faucibus leo, in lobortis tellus"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (4301,3,"pharetra nibh."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (4401,2,"nibh. Donec est mauris, rhoncus id, mollis nec,"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (4501,5,"id nunc interdum"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (4601,6,"lorem tristique aliquet. Phasellus"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (4701,3,"orci lacus vestibulum lorem, sit amet"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (4801,1,"nulla. Donec non justo. Proin non"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (4901,5,"consectetuer"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (5001,3,"sed,"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (5101,4,"Quisque fringilla euismod enim. Etiam gravida molestie arcu. Sed eu"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (5201,5,"dolor. Fusce mi lorem,"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (5301,3,"venenatis vel, faucibus id, libero. Donec consectetuer"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (5401,4,"vitae semper egestas, urna justo faucibus lectus, a sollicitudin"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (5501,5,"blandit viverra. Donec tempus, lorem fringilla ornare"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (5601,4,"tincidunt pede ac urna. Ut tincidunt vehicula"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (5701,2,"eu enim. Etiam imperdiet dictum magna. Ut tincidunt orci quis"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (5801,6,"augue"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (5901,4,"sapien imperdiet ornare. In faucibus. Morbi vehicula. Pellentesque"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (6001,3,"lacus. Aliquam rutrum"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (6101,3,"non sapien molestie orci tincidunt adipiscing. Mauris molestie pharetra"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (6201,6,"at pretium aliquet, metus urna convallis"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (6301,3,"tincidunt adipiscing. Mauris molestie pharetra nibh. Aliquam ornare, libero at"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (6401,1,"Phasellus at augue id ante dictum cursus."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (6501,3,"et, eros. Proin ultrices."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (6601,1,"molestie tortor nibh sit amet orci. Ut sagittis lobortis mauris."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (6701,1,"laoreet lectus quis"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (6801,5,"dictum eleifend, nunc"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (6901,6,"sagittis. Duis gravida. Praesent eu nulla at sem molestie"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (7001,1,"quis, tristique ac,"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (7101,3,"ut, sem. Nulla interdum. Curabitur dictum. Phasellus"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (7201,5,"metus facilisis lorem tristique aliquet. Phasellus"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (7301,3,"dignissim pharetra. Nam ac nulla. In tincidunt congue turpis."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (7401,5,"pede. Cum sociis natoque penatibus et magnis dis parturient"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (7501,6,"Vestibulum ante ipsum primis"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (7601,5,"nascetur ridiculus mus. Donec"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (7701,2,"a, arcu. Sed et libero."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (7801,4,"posuere at, velit."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (7901,1,"lorem"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (8001,2,"lacus. Nulla tincidunt,"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (8101,4,"massa rutrum magna. Cras convallis convallis dolor. Quisque"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (8201,5,"mus. Proin vel nisl. Quisque fringilla"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (8301,4,"justo faucibus lectus, a sollicitudin orci sem eget massa. Suspendisse"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (8401,2,"amet massa. Quisque porttitor eros nec"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (8501,4,"massa non ante bibendum ullamcorper."); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (8601,2,"Curabitur sed"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (8701,6,"lorem, vehicula et, rutrum"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (8801,6,"euismod"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (8901,2,"amet,"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (9001,3,"arcu imperdiet ullamcorper. Duis"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (9101,5,"Donec vitae erat vel pede blandit congue. In scelerisque scelerisque"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (9201,5,"Cras lorem lorem, luctus ut, pellentesque eget,"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (9301,2,"gravida sagittis. Duis"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (9401,5,"erat eget ipsum. Suspendisse sagittis. Nullam"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (9501,6,"Mauris"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (9601,4,"a sollicitudin orci sem eget"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (9701,4,"nonummy ultricies ornare, elit elit"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (9801,1,"pede sagittis augue, eu"); 
INSERT INTO `messages` (`message_id`,`thread_id`,`message`) VALUES (9901,5,"posuere vulputate, lacus. Cras interdum. Nunc"); 
+2

什麼是索引?任何? –

+2

請提供示例數據 –

+0

message_id和thread_id上有索引。在第二個提供樣本數據,輸出mysql – Darius

回答

0

如果不是MySQL中,明顯的解決辦法是使用SQL聚合窗口函數之一。鑑於mysql約束,「explodybits」博客上的this article似乎顯示了讓mysql模擬它們的有效解決方法。文章的總結似乎大致是下面的代碼。

select * from (
    select @row_num := IF(@prev_value=m.thread_id,@row_num+1,1) AS RowNumber, 
      m.*, 
      @prev_value := m.thread_id 
    from messages m, 
     (SELECT @row_num := 1) x, 
     (SELECT @prev_value := 0) y 
    where thread_id in (1,2,3) 
    order by thread_id 
) t1 where RowNumber <= 10; 
+0

完美!謝謝。我還沒有弄清楚像@這樣的mysql變量,從中學到了一些新東西。 – Darius

+0

也許值得指出的是,雖然我不是一個大的MySQL用戶,但是如果'SELECT m2。* FROM messages m2 JOIN(SELECT * FROM messages)'沒有非常糟糕的性能,我會感到非常驚訝 - 我沒有理由在那裏使用子查詢。如果你只是爲了獲得消息的「樹」,我建議閱讀[SQL Antipatterns Strike Back]中的「樸素樹」部分(http://www.slideshare.net/billkarwin/sql-antipatterns -strike回)。 – TML

1

你可以使用sql union和追加所有單查詢與自己的極限

$sql = ""; 
$threadsArray = explode($threads, ','); 
foreach($threadArray as $key=>$value){ 
    $sql .= "(SELECT * FROM messages WHERE thread_id = {$value} LIMIT 10)"; 

    if ($key != (count($threadsArray) - 1)) $sql .= " UNION "; // Append union expect for last element 
} 

// Execute your query and filter the results to group messages from each thread 
+0

我正在尋找避免工會。有沒有其他方法? – Darius

+0

也是這個問題[這裏](http://stackoverflow.com/questions/1415328/combining-union-and-limit-operations-in-mysql-query)將詳細解釋括號 –

+0

我會建議你使用個人查詢然後緩存它們。只有在添加新消息時才觸摸數據庫。將會很快 –

相關問題