2016-05-16 26 views
0

我需要從MySQL數據庫中得到一個結果集,其中有多個引用到每個項目的圖片。圖片有一個picture_no字段,其中最小的數字是我想返回的結果。如何獲得最低圖片數量的MySQL結果集?

SELECT 
    ca.*, 
    ca.ID AS ad_id, 
    ca.cat_id, 
    UNIX_TIMESTAMP(ca.date_edited) AS date, 
    cp.*, 
    ar.area_name 
FROM 
    $DB.$T4 ca 
     LEFT JOIN $T6 AS cp ON ca.ID = cp.classified_id AND cp.picture_no = 0 
     LEFT JOIN $T60 zip ON ca.zip_id = zip.zip_id 
     LEFT JOIN $T3 ar ON zip.area_id = ar.ID 
WHERE 
    ca.extern = 0 
    AND ca.confirmed = 1 
    AND ca.advertiser_id = ".$user['uid']." 
ORDER BY 
    date_created   
LIMIT 10 

正如你所看到的,我目前使用的AND cp.picture_no = 0,因爲我無法弄清楚如何獲得最低的數字圖片:

目前我使用此查詢。

這怎麼辦?函數min()不能幫助我解決問題。

+1

如果你喜歡,可以考慮下列行爲這個簡單的兩步過程:1.如果您還沒有這樣做,提供適當的創建和插入語句(和/或sqlfiddle),以便我們可以更容易地複製問題。 2.如果您尚未這樣做,請提供與步驟1中提供的信息相符的所需結果集。 – Strawberry

+0

您是否需要'cp'表中的每一列? –

回答

1

您可以使用此:

SELECT 
    ca.*, 
    ca.ID AS ad_id, 
    ca.cat_id, 
    UNIX_TIMESTAMP(ca.date_edited) AS date, 
    cp.*, 
    ar.area_name 
FROM 
    $DB.$T4 ca 
     LEFT JOIN (SELECT tmp.* 
        FROM $T6 tmp 
        INNER JOIN (SELECT classified_id, MIN(picture_no) min_picture_no 
           FROM $T6 
           GROUP BY classified_id) tmp1 
        ON tmp.classified_id = tmp1.classified_id 
          and tmp.picture_no = tmp1.min_picture_no 
        ) AS cp 
     ON ca.ID = cp.classified_id 
     LEFT JOIN $T60 zip ON ca.zip_id = zip.zip_id 
     LEFT JOIN $T3 ar ON zip.area_id = ar.ID 
WHERE 
    ca.extern = 0 
    AND ca.confirmed = 1 
    AND ca.advertiser_id = ".$user['uid']." 
ORDER BY 
    date_created   
LIMIT 10 

Editted:刪除AND cp.picture_no = 0,因爲它是提問者的唯一的臨時解決方案。感謝Paul Spiegel的建議。

+0

'AND cp.picture_no = 0'是一種解決方法。你應該刪除它。 –

+0

@PaulSpiegel arr謝謝,我的壞複製粘貼! –

+0

這看起來像可以工作。我確實得到了「#1060 - 重複列名'classified_id'」。另外我想知道這個解決方案是否足夠快。該腳本作爲cron_job在循環內爲每個用戶移出aprox 50K用戶。 – merlin

0

你可以改變加入到這樣的事情:

LEFT JOIN (select * from $T6 AS cp where ca.ID = cp.classified_id order by picture_no asc limit 1) on ca.ID = cp.classified_id 
+1

「除非在JOIN操作的ON子句中使用,否則」FROM子句中的子查詢不能是相關的子查詢。「 [FROM子句中的子查詢](https://dev.mysql.com/doc/refman/5.7/en/from-clause-subqueries.html)。 –

+0

@ PhamX.Bach - 如果在ON子句中正確使用,MySQL應該緩存每個'ca.ID'的結果。 –

0

這是不是最好的變種,但可以更換:

LEFT JOIN $T6 AS cp ON ca.ID = cp.classified_id AND cp.picture_no = 0 

有:

LEFT JOIN $T6 AS cp ON ca.ID = cp.classified_id 
LEFT JOIN $T6 AS cp_temp 
ON cp_temp.ID = cp.classified_id 
AND cp_temp.picture_no < cp.picture_no 

,並添加AND cp_temp.id IS NULL到在查詢結束子句。

所以最終的查詢可能是這樣的:

SELECT 
    ca.*, 
    ca.ID AS ad_id, 
    ca.cat_id, 
    UNIX_TIMESTAMP(ca.date_edited) AS date, 
    cp.*, 
    ar.area_name 
FROM $DB.$T4 ca 
LEFT JOIN $T6 AS cp 
ON ca.ID = cp.classified_id 
LEFT JOIN $T6 AS cp_temp 
ON cp_temp.ID = cp.classified_id 
    AND cp_temp.picture_no < cp.picture_no 
LEFT JOIN $T60 zip 
ON ca.zip_id = zip.zip_id 
LEFT JOIN $T3 ar 
ON zip.area_id = ar.ID 
WHERE ca.extern = 0 
    AND ca.confirmed = 1 
    AND ca.advertiser_id = ".$user['uid']." 
    AND cp_temp.id IS NULL 
ORDER BY date_created   
LIMIT 10