簡體   English   中英

MYSQL UNION ORDER BY

[英]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

這很好用,但現在我希望它顯示已經發生的最新結果。 例如,用戶A上傳了圖像 - >信息進入帶有時間戳的images 用戶A然后喜歡別人的圖像 - >信息進入帶有時間戳的image_likes 現在我將如何將兩個時間戳列合並在一起,以便我可以通過DESC對它們進行排序。

Breif繼續查詢查詢的內容。 選擇從圖像信息images ,其中用戶已喜歡上了一個形象image_likes ,然后將其抓住所有的用戶已經從上傳的上傳的images ,並將它們合並成一個查詢。 我需要的是能夠使用兩個表中的timestamp對它們進行排序。

這樣做怎么樣?

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

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

我將接近以下內容......下面的“PreQuery”以用戶首先喜歡的所有圖像開始,最大時間戳作為新列“MostRecent”。 然后,為下一組做一個UNION ALL。 下一組直接來自用戶的圖像表,但是LEFT JOINED到“喜歡”的圖像。 然后WHERE子句顯式排除那些使用“iml2.image_id IS NULL”在第一個集合中返回的子句。 我之所以這樣做是因為我對第一組聯盟如何處理小組沒有肯定,但是在第二組中沒有小組。 例如:如果圖像是用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

你為什么不使用'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
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM