2013-08-30 4 views
0

Я искал здесь несколько разных способов сделать это, но не могу заставить это работать. В принципе, у меня есть таблица с записью изображений, добавленных на веб-сайт. Каждое изображение помещается в эту таблицу. Я хочу захватить первые 5 изображений из каждого отдельного Добавленного поля.MYSQL Выберите 5 записей за последние 5 различных записей

Таким образом, таблица может выглядеть следующим образом:

ID File Folder Added 
---------------------------------- 
13 13.jpg Event3 20130830 
12 12.jpg Event3 20130830 
11 11.jpg Event3 20130830 
10 10.jpg Event3 20130830 
9 9.jpg Event3 20130830 
8 8.jpg Event2 20130701 
7 7.jpg Event2 20130701 
6 6.jpg Event2 20130701 
5 5.jpg Event2 20130701 
4 4.jpg Event1 20130615 
3 3.jpg Event1 20130615 
2 2.jpg Event1 20130615 
1 1.jpg Event1 20130615 

И я хочу возвращение быть похожим на это:

ID File Folder Added 
---------------------------------- 
13 13.jpg Event3 20130830 
12 12.jpg Event3 20130830 
8 8.jpg Event2 20130701 
7 7.jpg Event2 20130701 
4 4.jpg Event1 20130615 
3 3.jpg Event1 20130615 

Так в основном получать последние 5 (отсортированный по высшей ID первой) изображения для последних 5 отдельных «добавленных» дат (снова отсортированы для последних с добавленным полем). Спасибо!

EDIT ---------------

Так что это немного более ясно ... У меня есть таблица с изображениями я закачал на изображение, основанное Веб-сайт. Для передней части веб-сайта я хочу, чтобы в новостях размещались последние 5 галерей, в которых были загружены изображения и отображались 5 изображений из каждой из этих галерей. Каждое изображение, которое находится в mysql, имеет загруженную дату («Добавлено»), которая соответствует галерее, поскольку я загружаю изображения в галерею только один день за раз, а идентификационный номер, который автоматически увеличивается с каждым добавленным изображением («ID») , Конечно, есть куча других областей, но это самые важные из того, что я пытаюсь сделать.

EDIT # 2 ----------

Там очень много путаницы в том, как я это формулировка, это немного сложно объяснить, но в основном, как я могу получить 5 из самые высокие поля идентификатора для 5 отдельных добавленных полей даты из таблицы?

Я считаю, что он должен делать с этим, но она не работает, когда я запускаю его:

select TOP 5 * from (
    select *, 
row_no = row_number() over (partition by Added order by ID) 
from AviationImages) d 
where d.row_n <= 5 
+0

Как «13.jpg» и «12.jpg» в ваших желаемых результатах? – hjpotter92

+0

Потому что они были последними изображениями, загруженными на эту дату 20120830. И я ищу, чтобы получить последние 5 изображений, загруженных за 5 из последних отчетливых добавленных дат. –

+0

В приведенной выше таблице примеров содержится небольшая сумма. За последние несколько лет реальная таблица имеет тысячи изображений. –

ответ

2

Во многих других СУБД (Oracle, SQL-сервер, Postgres) вы можете использовать окно функцию:

SELECT id, file, folder, added 
FROM 
    (SELECT id, file, folder, added, 
      DENSE_RANK() OVER (ORDER BY added DESC) AS d_rank, 
      ROW_NUMBER() OVER (PARTITION BY added ORDER BY id DESC) AS row_no 
    FROM AviationImages 
) d 
WHERE d_rank <= 5   -- limit number of dates 
    AND row_no <= 5 ;  -- limit number of images per date 

В MySQL не может позволить себе роскоши оконной функции и OVER пункта:

SELECT i.id, i.file, i.folder, i.added 
FROM 
    (SELECT DISTINCT added 
     FROM AviationImages 
     ORDER BY added DESC 
     LIMIT 5 
    ) AS da 
    JOIN 
    AviationImages AS i 
     ON i.added = da.added 
     AND i.id >= COALESCE(
      (SELECT ti.id 
      FROM AviationImages AS ti 
      WHERE ti.added = da.added 
      ORDER BY ti.id DESC 
      LIMIT 1 OFFSET 4 
     ), -2147483647) ;    -- use 0 if the `id` is unsigned int 

Индекс по (added, id) поможет эффективность - и если таблица использует InnoDB и id является первичным ключом, то просто индекс на (added) будет достаточно.

+0

Так что это не сработает для php/mysql? –

+0

Первый номер №. Добавлен запрос для MySQL. –

+0

СПАСИБО! Это сработало отлично, и я закончил несколько часов, пытаясь понять это. Работает как шарм! –

1

Ваш выбор запрос должен выглядеть следующим образом:

mysql_query("SELECT * FROM tablename LIMIT 5 ORDER BY ID DESC"); 

В принципе, вы выбираете последний 5 результатов по убыванию.

Я рекомендую вам использовать MySQLi или PDO вместо MySQL

+0

Спасибо за ответ! К сожалению, это только дало бы мне последние 5 в целом на столе. Я ищу последние 5 изображений из последних 5 отдельных добавленных дат. Если бы я должен был использовать этот запрос он дал бы мне в ответ: '13 13.jpg EVENT3 20130830 12 12.jpg EVENT3 20130830 11 11.jpg EVENT3 20130830 10 10.jpg EVENT3 20130830 9 9.jpg EVENT3 20130830' –

+0

Я думаю, что я ищу это что-то вдоль линий этого ... но это дает мне ошибки: 'выберите * из ( выберите *, row_no = row_number() над (разделом добавленного приказом ID) от AviationImages ) d где d.row_n <= 5' –

1

Это не довольно запросов, но что-то, как это должно работать

select pictures.* 
from pictures 
inner join 
(
    select id 
    from pictures 
    group by added 
    order by added desc 
    limit 5 
) as galleries 
on pictures.added = galleries.added 
order by pictures.id desc 

where 
    (select count(0) from pictures as ip where ip.added = pictures.added and ip.id > pictures.id) >= 5 
+0

Благодарим за ответ @Ryan! Я опробовал ваш код, заменив изображения с помощью AviationImages (имя таблицы) и верхняя часть всех полей Добавлено и ID, поскольку mysql чувствителен к регистру ... но я получаю «У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'где (выберите count (0) from AviationImages как ip, где ip.Added = AviationImag' в строке 14'' –

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