簡體   English   中英

寫這個查詢的最佳方法是什么?

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

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