我有一个名为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
答案 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将需要临时表,这在繁忙的环境中不是很好。