[英]Best way to write this query?
我正在做一個子查詢連接到另一個表,因為我想能夠對我得到的結果進行排序,我只需要第一行,但我需要它們以某種方式排序,所以我會得到最低的id。
我嘗試將LIMIT 1
添加到此,但然后完整查詢返回0結果; 所以現在它沒有限制,在EXPLAIN
我有兩行顯示他們正在使用auction_media
表的完整10k +行。
我這樣編寫它是為了避免分別為每行查詢auction_media
表,但現在我認為如果必須使用整個auction_media表,這種方式不是很好嗎?
哪種方式更好? 我有它的方式或單獨查詢auction_media
表? ...或者,還有更好的方法!?
這是代碼:
SELECT
a.auction_id,
a.name,
media.media_url
FROM
auctions AS a
LEFT JOIN users AS u ON u.user_id=a.owner_id
INNER JOIN ( SELECT media_id,media_url,auction_id
FROM auction_media
WHERE media_type=1
AND upload_in_progress=0
ORDER BY media_id ASC
) AS media
ON a.auction_id=media.auction_id
WHERE a.hpfeat=1
AND a.active=1
AND a.approved=1
AND a.closed=0
AND a.creation_in_progress=0
AND a.deleted=0
AND (a.list_in='auction' OR u.shop_active='1')
GROUP BY a.auction_id;
編輯:通過我的測試,使用上面的查詢似乎是整體上更快的方法; 但是我擔心,當auction_media
表增長到1M行或類似內容時,情況仍然如此。
編輯:如評論中所述 - 不需要DISTINCT
因為拍賣表只能與(最多)一個用戶表行和內部查詢中的一行相關聯。
你可能想試試這個。
由於您沒有任何聚合函數,外部查詢的GROUP BY將替換為DISTINCT。
內部查詢被查詢替換,以查找每個auction_id最小的media_id,然后JOINed返回以獲取media_url。 (因為我不知道media_id和auction_id是否是復合唯一鍵,所以我使用相同的WHERE子句來幫助消除潛在的重復項。)
SELECT
a.auction_id,
a.name,
auction_media.media_url
FROM auctions AS a
LEFT JOIN users AS u
ON u.user_id=a.owner_id
INNER JOIN (SELECT auction_id, MIN(media_id) AS media_id
FROM auction_media
WHERE media_type=1
AND upload_in_progress=0
GROUP BY auction_id) AS media
ON a.auction_id=media.auction_id
INNER JOIN auction_media
ON auction_media.media_id = media.media_id
AND auction_media.auction_id = media.auction_id
AND auction_media.media_type=1
AND auction_media.upload_in_progress=0
WHERE a.hpfeat=1
AND a.active=1
AND a.approved=1
AND a.closed=0
AND a.creation_in_progress=0
AND a.deleted=0
AND (a.list_in='auction' OR u.shop_active='1');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.