我有一个包含游戏、文章(评论+预览)和视频(视频评论+视频预览)的数据库。我有一款 ID 为 233
的游戏,我想查找一篇评论、一篇预览、一篇视频评论和视频预览(如果存在)。
为此,我使用以下查询:
SELECT (SELECT article_url
FROM articles
WHERE articles_game_id = 233
AND artikel_sort = 'review'
AND article_online = 1
ORDER BY article_datetime DESC
LIMIT 1) AS review,
(SELECT article_url
FROM articles
WHERE articles_game_id = 233
AND artikel_sort = 'preview'
AND article_online = 1
ORDER BY article_datetime DESC
LIMIT 1) AS preview,
(SELECT trailer_url
FROM trailers
WHERE trailer_game_id = 233
AND trailer_sort = 'video review'
AND trailer_online = 1
ORDER BY trailer_datetime DESC
LIMIT 1) AS videoreview,
(SELECT trailer_url
FROM trailers
WHERE trailer_game_id = 233
AND trailer_sort = 'video preview'
AND trailer_online = 1
ORDER BY trailer_datetime DESC
LIMIT 1) AS videopreview
FROM articles
但是,这个查询有两个问题:
- 它查询数据库五次,这对我来说似乎效率不高。
- 如果没有评论(例如),则生成的 PHP 数组确实具有键为“review”的键/值对,但其值为空。但是,我希望这个键/值对完全不存在,因此我可以简单地循环数组并将每个键/值对打印为链接。
有人知道解决这个问题的有效方法吗?非常感谢任何帮助!
最佳答案
不幸的是,这似乎是一项任务,您无法使用单独的查询来逃脱。但是,我会使用 union
来组合查询的结果,而不是连接、选择列表中的子查询或单独的查询。
- 使用 union 时,客户端和数据库之间只有 1 次往返
- 如果联合中的查询不返回任何行,则它将不会出现在结果集中(请参阅OP中的要求)。请注意,
type
字段的值将告诉您返回的 url 的类型。
示例代码:
SELECT article_url, 'review' as type
FROM articles
WHERE articles_game_id = 233
AND artikel_sort = 'review'
AND article_online = 1
ORDER BY article_datetime DESC
LIMIT 1
UNION ALL
SELECT article_url, 'preview'
FROM articles
WHERE articles_game_id = 233
AND artikel_sort = 'preview'
AND article_online = 1
ORDER BY article_datetime DESC
LIMIT 1
UNION ALL
SELECT trailer_url, 'video review'
FROM trailers
WHERE trailer_game_id = 233
AND trailer_sort = 'video review'
AND trailer_online = 1
ORDER BY trailer_datetime DESC
LIMIT 1
UNION ALL
SELECT trailer_url, 'video preview'
FROM trailers
WHERE trailer_game_id = 233
AND trailer_sort = 'video preview'
AND trailer_online = 1
ORDER BY trailer_datetime DESC
LIMIT 1
另一种解决方案可能是使用子查询来获取最大日期(或 id,如果文章/预告片 id 是 auto_increment 字段)。但是,您将需要 2 个子查询(1 个或文章、1 个预告片),然后是 2 个查询,其中子查询连接回文章/预告片表,第 5 个顶部将它们组合成 1 个查询,所以我不会描述这种方法.
关于php - MYSQL 和 PHP : SELECT subquery without result returns array key with empty value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34394083/