0

このようなテーブルがあります(重要でない列は省略されています

`pictures` (
  `picture_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `picture_title` varchar(255) NOT NULL,
  `album_id` int(10) unsigned DEFAULT NULL,
  `authenticated` tinyint(4) DEFAULT '0',
  `approved` tinyint(4) DEFAULT '0'
)

私がやりたいことは、次と前の認証および承認されたpicture_idを取得することです。ただし、落とし穴があります - その出現にはpicture_id = album_idまたはが必要album_id IS NULLです。

これは、私が達成したいことを簡単に説明するための画像です。http://i.imgur.com/xTaEhwt.png

赤でマークされた列は選択したいもので、緑でマークされた列は私が持っているpicture_idで、次/前のIDを見つけたいです。picture_id と等しくない album_id があるため、picture_ids 2 < 9 をスキップし、認証/承認されていないため、picture_id 11 をスキップすることに注意してください。

どうすればこれを達成できますか? 私は無知です。

編集:少し言い直しました

4

1 に答える 1

1

次の点を考慮して、単純なユニオン クエリを使用できます。

  • 真ん中の写真はあなたのIDと一致しています。
  • 前の画像はあなたの条件に一致し、さらにそのIDは低くなりますが、表の下部から最も高いIDです。
  • 次の写真はあなたの条件に一致し、さらに ID は高くなりますが、表の上部から ID が最も低くなります。

2これを確認します ( 「id=album or album=null」制約に一致しないため、メモ IDがスキップされます):

このフィドルを参照してください: http://sqlfiddle.com/#!2/42ce6/17

  (SELECT 
    * 
  FROM 
    pics
  WHERE
    id = 10
  ) -- target id image
UNION
  (
  SELECT 
    * 
  FROM 
    pics
  WHERE
    id < 10 AND
    authenticated = 1 AND
    approved = 1 AND
    (id = album OR ISNULL(album))
  ORDER BY id DESC LIMIT 0,1
  ) -- highest id of lower part
UNION
  (
  SELECT 
    * 
  FROM 
    pics
  WHERE
    id > 10 AND
    authenticated = 1 AND
    approved = 1 AND
    (id = album OR ISNULL(album))
  ORDER BY id ASC LIMIT 0,1
  ) -- loweste id of upper part
  ORDER BY id

テーブルの「上部」部分と「下部」部分を、1フェッチする 2 つのエントリと正確に一致するように制限します。

出力:

ID  TITLE   ALBUM   AUTHENTICATED   APPROVED
1   My fav  1   1   1
10  test 2  (null)  1   1
12  Holiday pictures    (null)  1   1
于 2013-10-24T00:01:50.513 に答える