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