2013-01-15 106 views
2

我有一個名爲is_thumbnail的列,默認值爲no。我選擇基於一排掉的is_thumbnail = 'yes'如果值爲否,請選擇其他

$query = $conn->prepare("SELECT * FROM project_data 
          WHERE project_id = :projectId 
          AND is_thumbnail = 'yes' 
          LIMIT 1"); 

有機會的話,沒有行會的yes值。在這種情況下,我想要選擇第一行的那個projectId,不管is_thumbnail的值是多少

現在我知道我可以看到什麼查詢返回,然後運行另一個查詢。我想知道是否可以在單個查詢中做到這一點,或者有什麼方法可以利用PDO?我剛開始使用PDO。謝謝!

實施例的數據:

id project_id image        is_thumbnail 
20 2   50f5c7b5b8566_20120803_185833.jpg no 
19 2   50f5c7b2767d1_4link 048.jpg  no 
18 2   50f5c7af2fb22_4link 047.jpg  no 
+1

您可以通過'is_thumbnail'命令 – BevynQ

+0

得到一些樣本數據? – Kermit

+0

雖然我只返回一行。如果沒有行包含「is_thumbnail ='yes'',那麼我得到0行返回 – Ronnie

回答

3
$query = $conn->prepare("SELECT * FROM project_data 
          WHERE project_id = :projectId 
          ORDER BY is_thumbnail ASC LIMIT 1"); 
+0

+1:一旦我回過頭來問你,你已經想出了答案。但是,首先創建縮略圖不是簡單嗎,羅尼? – symcbean

+0

這似乎忽略了is_thumbnail是的事實。我將它更改爲ASC而不是DESC,現在它正在工作,謝謝 – Ronnie

+0

@symcbean所有這些都是縮略圖,該行聲明,如果你知道我的意思,那麼它就是整個項目的縮略圖預覽。我想這行應該是這樣的,'is_preview' – Ronnie

1

鑑於在問題中描述的架構顯示對於給定的project_id多行,僅使用ORDER BY is_thumbnail ...解決方案可能不會產生良好的性能,如果不存在用於實例中的一個項目與許多相關的行。排序行的成本可能相當高,並且不能使用索引。這可能是必要的另一種解決方案是:

SELECT * FROM (
    SELECT * 
    FROM project_data 
    WHERE project_id = :projectId AND is_thumbnail = "yes" 
    ORDER BY id DESC 
    LIMIT 1 

    UNION 

    SELECT * 
    FROM project_data 
    WHERE project_id = :projectId AND is_thumbnail = "no" 
    ORDER BY id DESC 
    LIMIT 1 
) AS t 
ORDER BY t.is_thumbnail = "yes" DESC 
LIMIT 1 

雖然該解決方案是複雜一點理解,它是能夠使用上(project_id, is_thumbnail, id)化合物索引快速準確地找到一個行匹配請求的條件。如果兩者都找到,外部選擇確保了是/否行的穩定排序。

請注意,您也可以只發出兩個查詢,並可能獲得相似或更好的性能。爲了使用上面的UNION和子選擇,MySQL將需要臨時表,這在臨時表中並不是很好。

相關問題