【问题标题】:SELECT other if value is no如果值为否,则选择其他
【发布时间】:2013-01-15 23:30:07
【问题描述】:

我有一个名为is_thumbnail 的列,默认值为no。我根据is_thumbnail = 'yes' 选择一行

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

有可能没有行的值为yes。在这种情况下,无论is_thumbnail 的值如何,我都想选择具有相同projectId 的第一行

现在我知道我可以看到查询返回的内容,然后运行另一个查询。我想知道是否可以在单个查询中执行此操作,或者是否可以通过某种方式利用 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

【问题讨论】:

  • 您可以通过is_thumbnail订购
  • 我只返回一行。如果没有行包含is_thumbnail = 'yes',则返回 0 行
  • 如果我删除 WHERE,那么我会从错误的项目 id 中获取图像
  • 好的,我知道现在使用 ORDER BY,谢谢@BevynQ

标签: mysql sql pdo


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

【讨论】:

  • +1:一旦我明白了这个问题,你就已经想出了答案。但是,罗尼,首先创建缩略图不是更简单吗?
  • 这似乎忽略了 is_thumbnail 是肯定的事实。我把它改成 ASC 而不是 DESC 现在它可以工作了,谢谢
  • @symcbean 所有这些都是缩略图,如果您知道我的意思,该行指出它是整个项目的缩略图预览。我猜该行应该类似于is_preview
  • 澄清一下,它的ASC 不是DESC
  • 好吧,我一定是对你的问题有点误解了,我改成ASC吧。
【解决方案2】:

鉴于问题中描述的架构显示给定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 需要临时表,这在繁忙的环境中不是很好。

【讨论】:

    猜你喜欢
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多