如果值为no,则选择其他

时间:2013-01-15 23:30:07

标签: mysql sql pdo

我有一个名为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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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将需要临时表,这在繁忙的环境中不是很好。