论å›ï¼ŒåŠ å…¥ï¼ŒåŠ å…¥å’ŒåŠ è½½çš„“最åŽå‘布â€

时间:2012-07-24 21:31:30

标签: php mysql join aggregate-functions

Codeigniter; Active Records Class

从那个主题开始,我问了一个关于CodeIgniter的问题,我现在想到的是完全原始的。

这是我目å‰çš„查询。

 SELECT `forums`.*, 
        Count(topics.id) threads, 
        Count(replies.id) replies, 
        `users`.`url` user_url, 
        `users`.`name` user_name,
        `ranks`.`name` user_rank  
 FROM (`forums`)  
 LEFT JOIN `topics` ON `topics`.`f_id` = `forums`.`id`  
 LEFT JOIN `replies` ON `replies`.`t_id` = `topics`.`id`  
 LEFT JOIN `users` ON `users`.`id` = `topics`.`a_id`  
 LEFT JOIN `ranks` ON `users`.`status` = `ranks`.`id`  
 LEFT JOIN (  
 SELECT `topics`.`url` topic_url, `topics`.`name` topic_name  
 FROM `topics`  
 ORDER BY `created` DESC  
 LIMIT 1  
 ) last_post ON `topics`.`f_id` = `forums`.`id`  
 GROUP BY `forums`.`id`

所以我è¦åšçš„就是把所有东西放在一个漂亮的行中。 “Last Post Byâ€æ—边的所有内容都正常工作,如果我删除åŽé¢çš„LEFT JOIN我添加了第一个,而ä¸æ˜¯æœ€åŽä¸€ä¸ªå¸–å­ã€‚

所以我的问题是;我现在åšé”™äº†ä»€ä¹ˆï¼Ÿ

å¦å¤–,一个é¢å¤–的问题,我早些时候和一ä½æœ‹å‹è°ˆè¿‡ï¼Œå½“涉åŠåˆ°PHPå’ŒMySQL时,他比我更了解,他告诉我åªéœ€å°†å®ƒå­˜å‚¨åœ¨æ•°æ®åº“中,last_post以åŠè®¡æ•°çº¿ç¨‹å’Œå›žå¤ã€‚

æå‰è‡´è°¢ã€‚

æ›´æ–°

这是论å›è¡¨

CREATE TABLE IF NOT EXISTS `forums` (  
  `id`    int(11) NOT NULL AUTO_INCREMENT,  
  `c_id`  int(11) NOT NULL,  
  `url`   varchar(255) NOT NULL,  
  `name`  varchar(255) NOT NULL,  
  `desc`  text NOT NULL,  
PRIMARY KEY (`id`),  
KEY `url` (`url`,`name`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;  

这是主题表

CREATE TABLE IF NOT EXISTS `topics` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `f_id`    int(11) NOT NULL,  
  `url`     varchar(255) NOT NULL,  
  `name`    varchar(255) NOT NULL,  
  `desc`    varchar(255) NOT NULL,  
  `body`    text NOT NULL,  
  `a_id`    int(11) NOT NULL,  
  `created` int(11) NOT NULL,  
  `edited`  int(11) NOT NULL,  
PRIMARY KEY (`id`),  
KEY `head` (`name`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;

我还å°è¯•æ›´æ–°å®ƒä¸Žé™ä»·ç¼–辑的显示方å¼ï¼Œæ­£å¦‚我第一次åšçš„那样,我希望这更具å¸å¼•åŠ›ã€‚

1 个答案:

答案 0 :(得分:2)

这是一个解决方案。我ä¸è®¤ä¸ºè¿™æ˜¯æœ€æœ‰æ•ˆçš„解决方案,但它应该有效。请注æ„,我将Topics SELECT移动到第一个SELECT行。

SELECT `forums`.*, 
        Count(topics.id) threads, 
        Count(replies.id) replies, 
        `users`.`url` user_url, 
        `users`.`name` user_name,
        `ranks`.`name` user_rank,
        (SELECT `topics`.`url` 
         FROM `topics` 
         WHERE `topics`.`f_id` = `forums`.`id` 
         ORDER BY `created` DESC LIMIT 1) topic_url,
        (SELECT  `topics`.`name`
         FROM `topics` 
         WHERE `topics`.`f_id` = `forums`.`id` 
         ORDER BY `created` DESC LIMIT 1) topic_name 
 FROM (`forums`) 
 LEFT JOIN `topics` ON `topics`.`f_id` = `forums`.`id`   
 LEFT JOIN `replies` ON `replies`.`t_id` = `topics`.`id`  
 LEFT JOIN `users` ON `users`.`id` = `topics`.`a_id`  
 LEFT JOIN `ranks` ON `users`.`status` = `ranks`.`id`  
 GROUP BY `forums`.`id`

å¯èƒ½æ›´æœ‰æ•ˆçš„æ–¹å¼

我没有数æ®æ¥æµ‹è¯•è¿™æ˜¯å¦æ›´å¿«ï¼Œä½†è¿™æ˜¯å¦ä¸€ç§æ–¹å¼ï¼ˆæˆ‘基于ROW_NUMBER() in MySQL。)这附带一个字符串,å³{{{ 1}}表格ä¸èƒ½åŒ…å«é‡å¤çš„topics,f_id组åˆï¼š

created

å°è¯•ä¸€ä¸‹ï¼Œé¦–先查看它是å¦æœ‰æ•ˆï¼Œç„¶åŽæŸ¥çœ‹å®ƒæ˜¯å¦æ›´å¿«ã€‚我很想å¬åˆ°ä½ çš„消æ¯ã€‚