Php 将第二个表中的第二个(有条件的)结果添加到SQL查询

Php 将第二个表中的第二个(有条件的)结果添加到SQL查询,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我在一个数据库中有两个表。一个存储具有索引ID的用户的名称/详细信息;另一个存储他们写的文章,只保留用户ID作为参考(fieldauthor)。到目前为止,一切都很简单。我可以轻松地查询文章列表,并在查询中包含对用户名和状态的请求: SELECT a.name, a.status, s.* FROM articles s, author a WHERE s.author=a.id 当我偶尔有第二作者学分时,问题就出现了,在字段author2中引用。到目前为止,我一直在做一个非常低效的第二次查询

我在一个数据库中有两个表。一个存储具有索引ID的用户的名称/详细信息;另一个存储他们写的文章,只保留用户ID作为参考(fieldauthor)。到目前为止,一切都很简单。我可以轻松地查询文章列表,并在查询中包含对用户名和状态的请求:

SELECT a.name, a.status, s.* FROM articles s, author a WHERE s.author=a.id
当我偶尔有第二作者学分时,问题就出现了,在字段author2中引用。到目前为止,我一直在做一个非常低效的第二次查询,当我遍历结果时,只是为了从表中获取第二个作者的姓名和状态(伪代码):

虽然这在PHP/MySQL中工作得很好(即使很笨拙),但我不得不升级到PHP7/PDO,我希望获得无缓冲查询的好处,所以这个嵌套查询将无法工作。显然,一个简单的解决方案是在foreach循环中迭代所有结果行并对每行执行这些额外的查询之前,先执行PDO->fetchALL()整个结果

但是,使用第二个ID(author2)以及主ID从author表中提取第二位数据,以某种方式将第二位数据合并到主查询中,效率会高得多,因此每行都添加了name2statuss2字段。我就是不知道怎么做

应该注意的是,虽然主author ID字段始终非零,但如果没有第二个ID,author2字段将包含零,并且author表中没有author ID 0,因此任何解决方案都需要通过在这些字段中提供空字符串或其他内容来处理author2 ID 0,而不是给出错误。(或者更不优雅的是,我认为可以向author表中添加一个具有空数据的伪author ID 0。)

有人能建议修改原始查询以避免此类二次查询吗?

切勿在
FROM
子句中使用逗号。始终使用正确、明确、标准的连接语法

对于您的查询,请使用
左连接

SELECT s.*, a1.name, a1.status, a2.name, a2.status
FROM articles s LEFT JOIN
     author a1
     ON s.author = a1.id LEFT JOIN
     author a2
     ON s.author2 = a2.id
切勿在
FROM
子句中使用逗号。始终使用正确、明确、标准的连接语法

对于您的查询,请使用
左连接

SELECT s.*, a1.name, a1.status, a2.name, a2.status
FROM articles s LEFT JOIN
     author a1
     ON s.author = a1.id LEFT JOIN
     author a2
     ON s.author2 = a2.id

戈登·林诺夫的答案看起来像你需要的

我本想加上这个作为评论,但这是一个太长的消息

我只是有一个关于数据库规范化的问题/意见。有author3的时候会有这样的例子吗?如果是这样,那么您可能应该有一个ArticleAuthor表。既然您正在重建代码,这可能是一个需要考虑的改进。

我不知道您存储的信息的名称和数据类型,所以这是我建议的结构的原始示例

Table Article
ArticleID
ArticleData...

Table Author
AuthorID
AuthorName
AuthorStatus

Table ArticleAuthor
ArticleID
AuthorID
如果状态取决于作者-文章组合,则AuthorStatus将移动到ArticleAuthor表,如下所示

Table ArticleAuthor
ArticleID
AuthorID
Status

戈登·林诺夫的答案看起来像你需要的

我本想加上这个作为评论,但这是一个太长的消息

我只是有一个关于数据库规范化的问题/意见。有author3的时候会有这样的例子吗?如果是这样,那么您可能应该有一个ArticleAuthor表。既然您正在重建代码,这可能是一个需要考虑的改进。

我不知道您存储的信息的名称和数据类型,所以这是我建议的结构的原始示例

Table Article
ArticleID
ArticleData...

Table Author
AuthorID
AuthorName
AuthorStatus

Table ArticleAuthor
ArticleID
AuthorID
如果状态取决于作者-文章组合,则AuthorStatus将移动到ArticleAuthor表,如下所示

Table ArticleAuthor
ArticleID
AuthorID
Status

样本数据和期望结果会有所帮助。样本数据和期望结果会有所帮助。从他的描述中,我假设[status]与locked2相同。“每行都添加了name2和locked2字段。”这看起来很棒。谢谢戈登!我正在管理一个由其他人编写的大型代码库,我认为(因为它工作正常)他的语法是好的。感谢您指出左连接的这种用法,它将改进我的许多代码。;)我只需要检查我是否可以使用:a2.name作为name2,a2.status作为status2等来获取返回行中的不同字段。而且它不会质疑联接表中没有ID 0。根据他的描述,我假设[status]与locked2相同。“每行都添加了name2和locked2字段。”这看起来很棒。谢谢戈登!我正在管理一个由其他人编写的大型代码库,我认为(因为它工作正常)他的语法是好的。感谢您指出左连接的这种用法,它将改进我的许多代码。;)我只需要检查我是否可以使用:a2.name作为name2,a2.status作为status2等来获取返回行中的不同字段。而且它不会因为在联接表中没有ID 0而争吵。谢谢您的建议。目前没有计划添加第三作者。。。英雄联盟谢谢你的建议。目前没有计划添加第三作者。。。英雄联盟