【发布时间】:2020-02-07 20:03:06
【问题描述】:
我在一个数据库中有两个表。一个使用索引 ID 存储用户的姓名/详细信息;其他存储他们写过的文章,它只是将用户的 ID 作为参考(字段 author)。到目前为止这么简单。我可以轻松查询文章列表并在查询中包含对用户姓名和状态的请求:
SELECT a.name, a.status, s.* FROM articles s, author a WHERE s.author=a.id
当我偶尔在字段 author2 中引用第二作者信用时,问题就出现了。到目前为止,当我遍历结果时,我一直在做我认为效率非常低的第二次查询,只是为了从表中获取第二作者的姓名和状态(伪代码):
while ( fetch a row ) {
if (author2 != 0) {
query("SELECT name, status FROM author WHERE id=author2") }
etc. }
虽然这在 PHP/MySQL 中运行良好(即使很笨重),但我不得不升级到 PHP7/PDO,并且我想获得无缓冲查询的好处,所以这个嵌套查询不起作用。显然,一个简单的解决方案是先 PDO->fetchALL() 整个结果,然后在 foreach 循环中迭代所有结果行并在每行执行这些额外的查询。
但是以某种方式将第二位数据合并到主查询中会更有效,使用第二个 ID (author2) 以及主 ID 从作者表中提取,以便在每一行中添加 name2 和 status2 字段。我只是看不到该怎么做...
需要注意的是,虽然主要作者 ID 字段总是非零,但如果没有第二个 ID,则 author2 字段将包含零,并且作者表中没有作者 ID 0,因此任何解决方案都需要通过在这些字段中提供空字符串或其他内容来处理 0 的 author2 ID,而不是给出错误。 (或者更不优雅的是,我想可以将带有空数据的虚拟作者 ID 0 添加到作者表中。)
任何人都可以建议一个可以避免此类二次查询的修改后的原始查询吗?
【问题讨论】:
-
样本数据和期望的结果会有所帮助。