2009-02-03 4 views
1

Я пытаюсь выбрать 5 наиболее просматриваемых статей из списка из 20 последних записей в таблице. Моя структура таблицы в основном это:Выберите max 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); 

У кого-нибудь есть предложения по структурированию этого запроса?

ответ

6

Я просто проверил это, и это работает версия

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

+0

Спасибо, это хорошо работает. Разумеется, предельная ошибка была только в подзапросах в операторах типа WHERE. – tj111

0

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

$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); 

Или что-то из этой природы ...

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

+0

тогда проб будет легче выбрать те 5 результатов вручную – SilentGhost

1

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

+0

Да я начинаю Думаю, мне придется. Но я решил, что это должно быть сделано в SQL. – tj111

0

Поскольку я не могу думать о какой-либо способ сделать это в одном запросе, я предлагаю либо выбрать топ-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

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

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

EDIT для MS SQL

Используйте LIMIT для MYSQL

+0

Чувак, он сказал, что его версия My SQL не поддерживает LIMIT (я понятия не имею, как он это справился, но там вы идете). Попробуйте прочитать весь вопрос перед ответом. –

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