【问题标题】:MYSQL: How to handle multiple values in one to many table JOINMYSQL:如何处理一对多表JOIN中的多个值
【发布时间】:2016-02-21 16:55:01
【问题描述】:

我无法弄清楚如何从 JOIN 中捕获多个值。应该没那么难,但不知怎的,我不记得如何做到这一点了。

Authors:

id | authorname

Books

id ] authorid |bookname

SELECT a.*,b.*  
FROM authors `a`
LEFT JOIN books `b` 
ON a.id = b.authorid 
WHERE a.id = 1
GROUP BY a.id

这只是返回作者的第一本书,而不是全部。

这不是整个查询,因为还有一些其他事情正在进行,例如出版商、最后订购等,因此我想按作者对其进行分组。此外,响应被 JSON 编码并发送到应用程序。出于这个原因,如果可能的话,我不希望查询返回每本书的行,因为这会使 jsonencoding 和 api 变得复杂。

我只是想弄清楚如何捕获作者的多本书并将它们保存在某种数组中,以便以后可以对其进行解码。

感谢您提供有关正确方法的任何想法。

编辑:

解决了 group_concat(b.bookname) 为 book names, ... 这会将多个值放在一个逗号分隔的列表中。

【问题讨论】:

  • 松开 GROUP BY 看看有什么作用
  • 它打印出每本书的记录。它确实获得了所有书籍,但记录不再与作者相对应,这是一个作者页面(列出了该作者的书籍。)

标签: mysql group-by


【解决方案1】:

我相信你需要删除你的GROUP BY 子句,因为你真的不需要那个。

SELECT a.*,b.*  
FROM authors `a`
LEFT JOIN books `b` 
ON a.id = b.authorid 
WHERE a.id = 1

您没有使用任何聚合函数,因此您不需要将结果集分组到分组列的单行中。

【讨论】:

  • 当我取出 GROUP BY 时,我得到了每本书的记录。因此,如果有三本书,则作者有三个记录。如果有两本书,则作者有两条记录。这会扰乱作者的显示。
  • 那么您最好向我们展示您用于处理结果的 PHP 代码。还有你想要的结果
  • @zztop 这是预期的行为。如果您想为每个作者设置一行,请添加GROUP BY 并使用聚合函数(如array_agg())来检索有关所有书籍的信息。你的问题似乎不是SQL-only。
  • 将研究 array_agg 但 group_concat 暂时工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 2015-12-10
  • 2011-06-06
  • 1970-01-01
  • 2013-01-25
相关资源
最近更新 更多