1

これを行うためのいくつかの異なる方法をここで検索しましたが、これを機能させることはできません。基本的に、Web サイトに追加された画像の記録を含むテーブルがあります。各画像はこのテーブルに入れられます。個別の Added フィールドごとに最初の 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 つの個別の「追加」日付の最後の 5 つの画像 (最も高い ID で最初に並べ替え) を取得します (ここでも追加フィールドで最新のものを並べ替えます)。ありがとうございました!

編集 - - - - - - - -

もう少し明確です...画像ベースのWebサイトにアップロードした画像でいっぱいのテーブルがあります。Web サイトの前面に、画像がアップロードされた最新の 5 つのギャラリーを示すニュースの宣伝文を作成し、それらの各ギャラリーから 5 つの画像を表示したいと考えています。mysql にある各画像には、一度に 1 日だけギャラリーに画像をアップロードするため、ギャラリーに対応するアップロード日 (「追加」) と、画像が追加されるたびに自動的に増加する ID 番号 (「ID」) があります。 . もちろん他にもたくさんの分野がありますが、それらは私がやろうとしていることにとって最も重要なものです。

編集#2 ----------

私がこれをどのように表現しているかについて多くの混乱があります。説明するのは少し難しいですが、基本的に、テーブルから 5 つの異なる追加日付フィールドの最大 ID フィールドの 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
4

3 に答える 3

3

他の多くの DBMS (Oracle、SQL-Server、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

OVERMySQL では、ウィンドウ関数と句の贅沢はありません。

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)するだけで十分です。

于 2013-08-31T01:06:07.863 に答える
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
于 2013-08-31T00:09:23.760 に答える
0

選択クエリは次のようになります。

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

基本的に、降順で最新の 5 つの結果を選択します。

MySQL の代わりに MySQLi または PDO を使用することをお勧めします

于 2013-08-30T23:17:28.737 に答える