1

我使用类似这样的 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;

如果以下查询正好有 1 行,我想用这个查询“选择”一条数据,“书签”,它的值为 TRUE:

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

否则“书签”的值为 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;

此解决方案不会将“书签”设置为 TRUE 或 FALSE,但我可以使用 NULL 与非 NULL。

4

2 回答 2

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希望您为此查询使用占位符和正确的 SQL 转义。

于 2012-08-19T05:12:44.960 回答
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:如果子选择返回大数字,它可能会成为性能问题,因为它会选择所有书签。这可以通过使用另一个带有限制子句的子选择而不是 group by 来调整。

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

于 2012-08-19T05:21:02.453 回答