我使用像这样的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。
答案 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
部分,他的版本将会破坏,而这个版本仍应有效。