запрос JOIN, отредактированный так, чтобы поле имело уникальные значения - PullRequest
1 голос
/ 06 мая 2009

У меня есть запрос JOIN, который извлекает последние 6 записей "topic" (записи с самыми высокими значениями topic_id, которые имеют значение topic_status, равное 0, т. Е. Это не спам):

SELECT topic_title, topic_slug, meta_value, topic_poster
FROM `folio_topics` as Topics
INNER JOIN `folio_topicmeta` as Topicmeta
ON Topics.topic_id = Topicmeta.topic_id
WHERE `topic_status` = 0
AND Topicmeta.meta_key = 'bb_attach_thumb'
ORDER BY Topics.`topic_id` DESC
LIMIT 6

Я хотел бы отредактировать этот запрос так, чтобы поле folio_topics.topic_poster было уникальным, т. Е. Я не получаю 6 записей с одинаковым topic_poster, а скорее 6 записей, каждая из которых имеет уникальное значение topic_poster.

Любая помощь будет оценена! : -)


Не обращая внимания на ответ Винсента, я пришел с запросом, который правильно вытягивает наибольший topic_id для каждого topic_poster, но это занимает 8,7 секунды, что крайне медленно по сравнению с большинством запросов (которые занимают меньше, чем 0,1 секунды). Есть ли способ оптимизировать этот запрос?

SELECT topic_title, topic_slug, meta_value, topic_poster
FROM `folio_topics` AS Topics
INNER JOIN `folio_topicmeta` AS Topicmeta
ON Topics.topic_id = Topicmeta.topic_id
WHERE Topics.topic_id IN (
    SELECT MAX(`topic_id`)
    FROM `folio_topics`
    WHERE `topic_status` = 0
    GROUP BY `topic_poster`)
AND Topicmeta.meta_key = 'bb_attach_thumb'
ORDER BY Topics.`topic_id` DESC
LIMIT 6

Ответы [ 2 ]

1 голос
/ 06 мая 2009

Согласно этой статье вы можете использовать Group By, чтобы выполнить то, что вы пытаетесь. Попробуйте это

SELECT topic_title, topic_slug, meta_value, topic_poster
FROM `folio_topics` as Topics
INNER JOIN `folio_topicmeta` as Topicmeta
ON Topics.topic_id = Topicmeta.topic_id
WHERE `topic_status` = 0
AND Topicmeta.meta_key = 'bb_attach_thumb'
Group By topic_poster
ORDER BY Topics.`topic_id` DESC
LIMIT 6
0 голосов
/ 06 мая 2009

В случае, если кто-нибудь сталкивался с этим, я не мог найти способ сделать этот огромный запрос быстрым, поэтому я разделил его на два запроса в коде. Вот код PHP:

$folio_posters = $wpdb->get_results("SELECT MAX( `topic_id` ) as topiclist FROM `folio_topics` WHERE `topic_status` =0 GROUP BY `topic_poster` ORDER BY topiclist DESC LIMIT 6");

foreach ($folio_posters as $folio_poster) {
    $folio_poster_list[] = $folio_poster->topiclist;
}

$foliopics = $wpdb->get_results("SELECT topic_title, topic_slug, meta_value, topic_poster FROM `folio_topics` AS Topics INNER JOIN `folio_topicmeta` AS Topicmeta ON Topics.topic_id = Topicmeta.topic_id WHERE Topics.topic_id IN (" .  implode ($folio_poster_list, ',') . ") AND Topicmeta.meta_key = 'bb_attach_thumb' ORDER BY Topics.`topic_id` DESC");

Если кто-нибудь выяснит, как это сделать с помощью одного запроса, я приму эту версию. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...