2014-03-02 6 views
0

Я пишу сценарий для своих настраиваемых форумов, который определяет, были ли новые потоки или ответы отправлены на определенной доске с момента последнего посещения пользователем этой платы (board_marks). У меня есть две таблицы: одна, в которой хранятся потоки, другая, где хранятся ответы. Я могу легко найти, есть ли какие-либо новые ответы на доске, используя левое соединение. Я хочу добавить немного, что находит, если в этой доске есть новые потоки. Как мне это сделать?Как объединить эти два запроса в один?

Мои таблицы:

CREATE TABLE IF NOT EXISTS `forum_threads` (
    `thread_id` int(15) NOT NULL AUTO_INCREMENT, 
    `board_id` int(15) NOT NULL, 
    `author_id` int(15) NOT NULL, 
    `updater_id` int(15) NOT NULL, 
    `title` text NOT NULL, 
    `content` text NOT NULL, 
    `date_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `date_updated` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `views` int(15) NOT NULL, 
    `status` tinyint(1) NOT NULL, 
    `type` tinyint(1) NOT NULL COMMENT '0 normal, 1 sticky, 2 global.', 
    PRIMARY KEY (`thread_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE IF NOT EXISTS `forum_messages` (
    `message_id` int(15) NOT NULL AUTO_INCREMENT, 
    `thread_id` int(15) NOT NULL, 
    `author_id` int(15) NOT NULL, 
    `modifier_id` int(15) DEFAULT NULL, 
    `content` text NOT NULL, 
    `date_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `date_modified` timestamp NULL DEFAULT NULL, 
    `status` tinyint(1) NOT NULL, 
    PRIMARY KEY (`message_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Мой сценарий:

$this->db->select('m.message_id, m.thread_id, m.date_posted, t.thread_id, t.board_id'); 
$this->db->from('forum_messages AS m'); 
$this->db->join('forum_threads AS t', 'm.thread_id = t.thread_id', 'left'); 
$this->db->where('t.board_id', $board_id); 
$this->db->where('m.date_posted > "'.$last_mark['date_marked'].'"'); 

if($query_new_messages = $this->db->get()){ 

    if($query_new_messages->num_rows() > 0){ 

      $contains_new_posts = TRUE; 

    } else { 

      $contains_new_posts = FALSE; 

    } 

} 

Фактический запрос:

SELECT 
    m.message_id, m.thread_id, m.date_posted, t.thread_id, t.board_id 
FROM (forum_messages AS m) 
LEFT JOIN forum_threads AS t ON m.thread_id = t.thread_id 
WHERE `t`.`board_id` = '10' AND `m`.`date_posted` > "2014-03-02 06:01:31" 

PS: Я делаю это в CodeIgniter.

ответ

0

OR условие получит вам данные, которые вы хотите:

SELECT 
    m.message_id, m.thread_id, m.date_posted, t.thread_id, t.board_id 
FROM (forum_messages AS m) 
    LEFT JOIN forum_threads AS t ON m.thread_id = t.thread_id 
WHERE `t`.`board_id` = '10' 
    AND (`m`.`date_posted` > "2014-03-02 06:01:31" 
     OR `t`.`date_posted` > "2014-03-02 06:01:31") 

Вы должны Benchmark это, однако. Это решение, вероятно, не очень оптимизировано. Вам следует выполнить два быстрых запроса - один для сообщений и один для потоков - против одного потенциально более медленного.

+0

Хм, спасибо за наконечник. Я имел в виду, что один большой запрос будет быстрее, чем несколько небольших запросов. И ваша модификация, похоже, работает, поэтому спасибо! – ShoeLace1291

+0

@ ShoeLace1291 иногда одиночные запросы быстрее, иногда несколько - вам просто нужно профилировать ваши данные. – dethtron5000

Смежные вопросы