2016-10-04 3 views
0

После обновления форума у ​​меня остались пустые поля, которые должны были быть заполнены. Я пытаюсь обновить таблицу с именем thread с полями из таблицы с именем post. Мне нужно обработать стол стол, упорядоченный по потоку, postid.MYSQL Пройдите через одну таблицу и обновите другую

Table: post 
Field: postid - data is valid 
Field: threadid - data is valid 

Table: thread 
Field: threadid - data is valid and matches post.threadid 
Field: firstpostid - should be first post.postid found 
Field: lastpostid - should be last post.postid found 
Field: lastpost - should be last post.postid found 

Все Стараюсь приносит такое же значение для firstpostid и lastpostid

Это примерно так же близко, как я получил, пытаясь установить способ обновить одно поле в то время. Я не могу правильно установить порядок.

UPDATE thread 
INNER JOIN post ON post.threadid = thread.threadid 
SET thread.firstpostid = 
IF(thread.firstpostid > post.postid, post.postid, thread.firstpostid) 
WHERE postid <> 0 

Любые указатели были бы замечательными. Спасибо

ответ

0

Мы могли бы использовать коррелированные подзапросы, хотя это, скорее всего, самый неэффективный подход. Для разумной производительности, мы определенно хотим иметь соответствующий индекс доступный, например:

... ON post (thread_id, post_id) 

(любой индекс с thread_id и post_id как ведущих столбцов в этом порядке)

Мы можем использовать скалярный подзапрос для получения значения post_id, которое должно быть присвоено каждому столбцу. (В данном контексте подзапросы должны быть скаляр: запрос должен возвращать не более одной строки, содержащей одно значение:.

UPDATE thread t 
    SET t.firstpostid = 
     (SELECT p1.post_id 
      FROM post p1 
      WHERE p1.thread_id = t.thread_id 
      ORDER BY p1.thread_id, p1.post_id 
      LIMIT 0,1 
     ) 
     , t.secondpostid = 
     (SELECT p2.post_id 
      FROM post p2 
      WHERE p2.thread_id = t.thread_id 
      ORDER BY p2.thread_id, p2.post_id 
      LIMIT 1,1 
     ) 
     , t.lastpostid = 
     (SELECT p9.post_id 
      FROM post p9 
      WHERE p9.thread_id = t.thread_id 
      ORDER BY p9.thread_id DESC, p9.post_id DESC 
      LIMIT 0,1 
     ) 

«Трюк» является разделом ПРЕДЕЛА, который применяется после того, как заказ по

LIMIT 0,1 говорит пропустить 0 строк и возвращает следующие строки 1 LIMIT 1,1 говорит пропустить 1 строку и возвращает следующие строки 1

Чтобы получить последнюю post_id, мы обратный порядок сортировки (DESC = по убыванию, по сравнению по умолчанию ASC = по возрастанию).

+0

Я ценю вашу помощь, но я все еще борется. Соответствующие таблицы - это небольшие 5300 сообщений и 333 темы, поэтому я не против использования простого неэффективного кода для выполнения задания. Я был бы очень счастлив пройти через таблицы пару раз, чтобы установить одно поле за проход. Думаю, я мог бы справиться с этим, если бы знал, где использовать указатель или по порядку по инструкции. – Chris

+0

В идеале мне нужно пройти через стол столбца запись за раз, используя порядок threadid, postid и записать в поток таблицы. Это возможно? – Chris

+0

Можно обрабатывать строки отдельно RBAR (строка по агонистической строке). Это подход, который принимает много неофитов. Такой подход не идеален, потому что он оказывается мучительно медленным и непозволительно ресурсоемким на больших множествах. Это неизбежно приводит к тому, «почему это так медленно на моем объеме производства, когда он работал на моем небольшом наборе тестов». Эффективно работать с «наборами» данных. – spencer7593

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