2012-04-11 105 views
1

我现在有这个MYSQL UNION ORDER BY

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 

而这个伟大的工程,但现在我希望它显示最近的结果,多数民众赞成已经happend。 例如,用户A上传了一个图像 - >信息,并带有时间戳记images。用户A然后喜欢别人的图像 - >信息进入image_likes与时间戳。现在,我将如何使两个时间戳列合并在一起,所以我可以通过DESC对它们进行排序。

Breif运行了查询的内容。 从images中选择图像信息,其中用户喜欢image_likes中的图像,然后从images获取用户上传的所有上传并将它们合并到查询中。我需要的是能够使用这两个表中的timestamp对它们进行排序。

+1

什么时间戳?你没有向我们展示表格的结构 - 而'select *'只是混乱的编程 – symcbean 2012-04-11 12:51:57

+0

我需要结果中的所有信息。两个表中都有时间戳。 – Harry 2012-04-11 12:58:37

回答

4

怎么样?

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

UPDATE

试试这个

(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 

UPDATE

最终的查询按照您的要求

(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 
+0

恐怕它没有合并来自images.timestamp和image_likes.timestamp的两个时间戳字段,然后对它们进行排序:/ – Harry 2012-04-11 12:50:37

+0

好吧,所以你希望工会的第一部分也按照images_like的时间戳排序? – 2012-04-11 12:52:09

+0

基本上查询是做什么的。看看用户是否喜欢任何图像,如果他们从'图像'中抓取图像信息,然后抓取用户上传图像的信息。他们是在这两个表中的时间戳,所以我需要他们合并,所以我可以例如显示一个图像已被喜欢1分钟前,他们上传的图像前2分钟:) – Harry 2012-04-11 12:54:17

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 
1

我会用下面的方法...的“PreQuery”下面的用户喜欢首先图像开始,以最大时间戳作为新列“MostRecent”。那么,为下一组做一个联盟。下一个集合直接来自用户的图像表格,但是被LEFT JOINED连接到“喜欢的”图像。然后,WHERE子句通过使用“iml2.image_id IS NULL”明确排除那些在第一组中会返回的内容。我之所以这样做,是因为我并不积极地看待工会如何在第一盘中处理小组,而在第二盘中则没有小组。例如:如果图像是使用日期/时间戳创建的,比如说3月3日,但也是3月5日的“Like”,我不希望列出每个不同日期的一个实例(因为union已经限定了不同的暗示)。这就是说,我将有一个预先约定的结果,人们喜欢它最近的日期/时间戳,以及他们所有的个人图像及其各自的日期/时间戳。现在,它简单地连接回图像表来获取细节(通过别名“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 
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