2013-01-15 65 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将需要临时表,这在临时表中并不是很好。

相关问题