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带有时间戳。现在我将如何使两个时间戳列合并在一起,以便我可以按 DESC 对它们进行排序。

Breif 超出了查询的作用。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

chk 这个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。下一组直接来自用户的图像表,但左连接到“喜欢的”图像。然后,WHERE 子句明确排除了使用“iml2.image_id IS NULL”在第一组中返回的那些。我这样做是因为我对工会在第一盘中如何处理 group by 并不积极,但在第二盘中没有 group by。例如:如果图像是使用 3 月 3 日的日期/时间戳创建的,但也发现为 3 月 5 日的“喜欢”,我不希望将一个实例列为每个不同的日期(因为联合已经限定了不同的隐含)。

也就是说,我将获得该人喜欢的任何图像及其最新日期/时间戳的单个预查询结果,以及他们自己的所有个人图像及其各自的日期/时间戳。现在,它简单地连接回图像表以获取详细信息(通过别名“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

为什么不使用“或”?

那样 :

  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 回答