1

私は現在これを持っています

SELECT  *
FROM    images
WHERE   images.id IN (SELECT image_id FROM image_likes WHERE user_id = '1')
    UNION
SELECT * 
FROM images
WHERE images.user_id = '1' AND upload_type in (4,3) ORDER BY id DESC

これはうまく機能しますが、最近起こった結果を表示したいと思います。たとえば、ユーザー A が画像をアップロードした場合 -> 情報はimagesタイムスタンプと共に入力されます。ユーザー A が他の人の画像を気に入る ->image_likesタイムスタンプと共に情報が入ります。ここで、2 つのタイムスタンプ列をマージして、DESC で並べ替えるにはどうすればよいでしょうか。

クエリが何をするかについて簡単に説明します。imagesユーザーが画像を気に入った場所から画像情報を選択しimage_likes、ユーザーがアップロードしたすべてのアップロードを取得imagesしてクエリにマージします。私が必要とするのはtimestamp、両方のテーブルからを使用してそれらをソートできるようにすることです。

4

4 に答える 4

3

こうしたらどうですか??

SELECT * FROM (
    SELECT  *
    FROM    images
    WHERE   images.id IN (SELECT image_id FROM image_likes WHERE user_id = '1')
        UNION
    SELECT * 
    FROM images
    WHERE images.user_id = '1' AND upload_type in (4,3) ORDER BY id DESC
) AS a ORDER BY a.timestamp DESC;

またはさらに良い

 (SELECT  *
    FROM images
    WHERE images.id IN (SELECT image_id FROM image_likes WHERE user_id = '1'))
        UNION
 (SELECT * 
    FROM images
    WHERE images.user_id = '1' AND upload_type in (4,3) ORDER BY id DESC)
 ORDER BY timestamp DESC

これを確認してくださいhttp://dev.mysql.com/doc/refman/5.5/en/union.html

アップデート

これを試して

 (SELECT images.id, images_likes.timestamp as timestamp FROM images JOIN images_likes 
    ON images.id=image_likes.image_id WHERE user_id = '1')
        UNION
 (SELECT images.id, images.timestamp as timestamp
    FROM images
    WHERE images.user_id = '1' AND upload_type in (4,3) ORDER BY id DESC)
 ORDER BY timestamp DESC

アップデート

要件に応じた最終クエリ

 (SELECT images.id, images.user_id, images.ext, images.upload_type, images_likes.timestamp as timestamp FROM images JOIN images_likes 
    ON images.id=image_likes.image_id WHERE images_likes.user_id = '1')
        UNION
 (SELECT images.id, images.user_id, images.ext, images.upload_type, images.timestamp as timestamp
    FROM images
    WHERE images.user_id = '1' AND upload_type in (4,3) ORDER BY id DESC)
 ORDER BY timestamp DESC
于 2012-04-11T12:46:17.753 に答える
1

私は次のようにアプローチします...以下の「PreQuery」は、ユーザーが最初に好きなすべての画像から始まり、最大タイムスタンプが新しい列「MostRecent」になります。次に、次のセットのために UNION ALL を実行します。次のセットは、ユーザーのイメージ テーブルから直接取得されますが、「いいね」されたイメージに LEFT JOINED されます。次に、WHERE 句は、「iml2.image_id IS NULL」を使用して最初のセットで返されるものを明示的に除外します。組合が最初のセットでグループをどのように処理するかについて確信が持てなかったので、私はこれを行いましたが、2番目のセットではグループを処理しませんでした. 例: 画像が 3 月 3 日の日付/タイムスタンプで作成されていて、3 月 5 日の「いいね」としても見つかった場合、1 つのインスタンスをそれぞれの個別の日付としてリストする必要はありません (ユニオンは既に個別の暗黙の資格を満たしているため)。

とは言っても、その人が気に入った画像とその最新の日付/タイム スタンプ、およびすべての個人的な画像とそれぞれの日付/タイム スタンプの単一のプレクエリ結果が得られます。ここで、イメージ テーブルに単純に結合して詳細を取得し (エイリアス "i2" を介して)、PreQuery.MostRecent 列で並べ替え、次にイメージ ID 値の降順で並べ替えます。

SELECT
      i2.*
   from
      ( select iml.image_id as id,
               max( iml.YourTimeStamp ) as MostRecent
           from image_likes iml
           where iml.user_id = '1'
           group by iml.image_id

        UNION ALL

        select i.id,
               i.ImageTimeStamp as MostRecent
           from images i
              left join image_likes iml2
                 on i.id = iml2.image_id
                 and iml2.user_id = '1'
           where i.user_id = '1'
             and i.upload_type in ( 4, 3 )
             and iml2.image_id is null 
      ) PreQuery
         JOIN Images i2
            on PreQuery.id = i2.id
   order by
      PreQuery.MostRecent,
      PreQuery.ID desc
于 2012-04-11T13:39:08.617 に答える
0

なぜ「OR」を使わないのですか?

そのように:

  SELECT  *
  FROM    images
  WHERE   images.id IN (SELECT image_id FROM image_likes WHERE user_id = '1')
      OR  (images.user_id = '1' AND upload_type in (4,3))
 ORDER BY id DESC
于 2012-04-11T13:00:21.563 に答える
0
SELECT *
FROM 
  ( SELECT  im.*
          , li.timestamp AS ts
    FROM    images AS im 
      JOIN  image_likes AS li
        ON  li.image_id = im.image_id
    WHERE   li.user_id = 1
  UNION ALL
    SELECT *
         , timestamp AS ts
    FROM images 
    WHERE user_id = 1 
      AND upload_type in (4,3) 
  ) AS tmp
ORDER BY ts DESC
于 2012-04-11T13:47:11.493 に答える