如果查询有1行,则返回一个值,否则返回另一个值

时间:2012-08-19 04:50:05

标签: mysql sql

我使用像这样的mySQL查询来获取我需要的关于照片的一些信息:

SELECT
users.first_name,
users.last_name,
photos.filename,
photos.YEAR,
photos.description,
themes.name AS theme_name

FROM
`photos`,
`users`,
`themes`

WHERE
users.facebook_id = photos.author AND
themes.id = photos.theme AND
photos.id = 35

LIMIT 1;

我希望使用此查询“选择”另一段数据,'bookmarked',如果以下查询只有1行,则其值为TRUE:

SELECT * FROM bookmarks WHERE photo_id = 35 and facebook_id = 19484;

否则'bookmarked'的值为FALSE。

这可以在一个查询中完成吗?

编辑 - 我稍微改变了Tadman的解决方案。在这里,它完美无缺!

SELECT
users.first_name,
users.last_name,
photos.filename,
photos.YEAR,
photos.description,
themes.name AS theme_name,
bookmarks.id AS bookmark 

FROM
`photos`,
`users`,
`themes`

LEFT JOIN bookmarks ON bookmarks.photo_id = 35 AND bookmarks.facebook_id = 19484

WHERE
users.facebook_id = photos.author AND
themes.id = photos.theme AND
photos.id = 35

LIMIT 1;

此解决方案未将'bookmark'设置为TRUE或FALSE,但我可以使用NULL而不是NULL。

2 个答案:

答案 0 :(得分:2)

您可以对此进行LEFT JOIN以将书签拉入(如果存在)。理想情况下,每个用户最多只有一张和每张照片只有一个书签,或者您可能有重复的行,每个书签一个:

SELECT
  ...,
  bookmarks.photo_id
FROM photos, users, themes
LEFT JOIN bookmarks ON bookmarks.photo_id=? AND photos.facebook_id=users.facebook_id
WHERE
  ...
LIMIT 1

LEFT JOIN是一个可选的连接,即它可能成功也可能不成功,如果失败,它会将关联的列保留为NULL。您可以检查bookmarks.photo_id是否已定义,如果是,则会显示书签。

此处?代表您指定的photos.id条件的占位符。希望您使用占位符和proper SQL escaping进行此查询。

答案 1 :(得分:0)

SELECT
users.first_name,
users.last_name,
photos.filename,
photos.YEAR,
photos.description,
themes.name AS theme_name

FROM
`photos`,
`users`,
`themes`,
case (SELECT count(*) 
    FROM bookmarks 
    WHERE photo_id = photos.id 
    and facebook_id = users.facebook_id 
    group by photo_id, facebook_id
) when 0 then false
else 0
end case
WHERE
users.facebook_id = photos.author AND
themes.id = photos.theme AND
photos.id = 35
LIMIT 1;

注1:将包含拼写错误和内容。认为他们是一个练习

注意2:如果subselect返回大数字,它可能会成为性能问题,因为它选择了所有书签。这可以通过使用带有限制子句的另一个子选择而不是group by来调整。

注3:Tadmans解决方案在当前形式下可能更快,但如果您想要松开limit 1部分,他的版本将会破坏,而这个版本仍应有效。