Выберите максимум 5 целых чисел из набора 20 - PullRequest
1 голос
/ 03 февраля 2009

Я пытаюсь выбрать 5 самых просматриваемых статей из списка 20 самых последних записей в таблице. Моя структура таблицы по сути такая:

id | date | title | content | views

Моей первой мыслью было просто использовать внутренний выбор, чтобы получить 20 самых последних статей, а затем выбирать из этого, но мне еще не повезло.

//doesn't work (my version of mysql doesn't support LIMIT in sub queries)
$recent = "(SELECT id FROM news ORDER BY date DESC LIMIT 20)";
$result = $db->query("SELECT id, title, date, content FROM news WHERE id IN $recent ORDER BY views DESC LIMIT ".self::RECENT_MAX);

//neither does this (syntax error @ 'OFFSET 20')
$recent = "(SELECT MAX(date) FROM news ORDER BY date DESC OFFSET 20)";
$result = $db->query("SELECT id, title, date, content FROM news WHERE date > $recent ORDER BY views DESC LIMIT ".self::RECENT_MAX);

Кто-нибудь получил какие-либо предложения о том, как бы вы структурировали этот запрос?

Ответы [ 5 ]

6 голосов
/ 03 февраля 2009

Я только что проверил это, и оно работает

SELECT *
FROM (
    SELECT *
    FROM news
    ORDER BY id DESC
    LIMIT 0, 20
) lasttwenty
ORDER BY views DESC
LIMIT 0, 5

Версия сервера: 5.0.51a-3ubuntu5.4

1 голос
/ 03 февраля 2009

Если у вас много проблем с его работой через SQL, я бы посоветовал просто взять 20 самых последних статей из базы данных, а затем обработать их в PHP, чтобы найти 5 самых просматриваемых. Вы можете либо циклически проходить по строкам, либо просто загрузить все это в массив и отсортировать его.

0 голосов
/ 03 февраля 2009

Попробуйте это ...

select top 5 number from
(
    select 
         top 20 (ID) as number
    from 
        news order by date desc
)
as number

РЕДАКТИРОВАТЬ ДЛЯ MS SQL

Использовать LIMIT для MYSQL

0 голосов
/ 03 февраля 2009

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

$items = $db->query("SELECT id FROM news ORDER BY date DESC LIMIT 20");
$recent = array();
foreach ($items->fetchAll() as $item) { $recent[] = $item['id']; }
$recent = "('".join("','", $recent)."')";

$result = $db->query("SELECT id, title, date, content FROM news WHERE id IN {$recent} ORDER BY views DESC LIMIT ".self::RECENT_MAX);
0 голосов
/ 03 февраля 2009

Почему бы вам не выполнить первый (внутренний) запрос отдельно и создать второй запрос программно?

$ids = array();
$result = $db->query("SELECT id FROM news ORDER BY date DESC LIMIT 20");
while ($row = $result->fetch()) {
    $ids[] = $row[0];
}
$ids = implode(',', $ids);
$result = $db->query("SELECT id, title, date, content FROM news WHERE id IN ($ids) ORDER BY views DESC LIMIT ".self::RECENT_MAX);

Или что-то в этом роде ...

Обновление : Или вы можете просто получить первые 20, отсортированные по date, затем отсортировать массив результатов по views в PHP и, наконец, взять 5 самых верхних элементов (я думаю, что SilentGhost имел в виду в комментарии).

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