2012-04-11 104 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