【问题标题】:Get data from relational table with multiple rows从具有多行的关系表中获取数据
【发布时间】:2016-04-28 14:08:53
【问题描述】:

我有这张桌子:

博客

id
name
user_id // author - relational to "users"

用户

id
nickname
avatar

订阅

id
blog_id // relational to "blogs"
user_id // relational to "users"

我们的想法是在网站上显示如下内容:

Blogname
Created By Stack
Suscriptions: Overflow, Easy, Robinson, Porter

我正在从blogs获取所有数据

SELECT
    b.id,
    b.name,
    b.user_id,
    u.nickname as user_nickname,
    u.avatar as user_avatar
FROM blogs b
LEFT JOIN users u ON b.user_id = u.id

使用 PHP,我创建了一个包含所有 blogs ID 的数组,因此我可以将它们与 IN 运算符一起使用,如下所示:

SELECT
    s.id,
    s.blog_id,
    u.nickname,
    u.avatar
FROM suscriptions s
LEFT JOIN users u ON s.user_id = u.id
WHERE s.blog_id IN (1, 2, 3)

然后再用 PHP 对结果进行排序。

但是,有没有更好的方法?我在考虑只使用 MySQL 而不是 PHP。也许在一次查询中获取所有数据?或者最好的方法是什么?

请务必记住,blog 可以有多个 subscriptions

我发现 2012 年的这个问题有点相似:JOIN three tables and aggregate data from multiple rows for every DISTINCT row in separate column 但是OP说它真的很慢,所以我现在有点迷茫。

【问题讨论】:

  • 你用的是核心php还是一些框架?
  • @SulthanAllaudeen 仅用于数据库处理的 PDO

标签: php mysql database


【解决方案1】:

我认为您需要将“加入订阅”生成的所有行分组并用逗号连接它们以进行演示。

SELECT
    b.id AS blog_id,
    b.name AS blog_name,
    u.nickname AS user_create_nickname,
    u.avatar AS user_create_avatar,
    GROUP_CONCAT(us.nickname SEPARATOR ', ') AS users_suscritions
FROM blogs b
INNER JOIN users u ON b.user_id = u.id
LEFT JOIN suscriptions s ON s.blog_id = b.id
LEFT JOIN users us ON s.user_id = us.id
GROUP BY b.id;

【讨论】:

  • 真的很有帮助,谢谢!但我也想知道订阅的信息,因为它会有其他列,如日期等。很抱歉没有在这个问题上解释这一点。
  • 我明白了,在这种情况下,据我所知,你确实需要两个查询
  • GROUP_CONCAT 现在运行良好,谢谢!
【解决方案2】:

你可以做这两个中的任何一个。几个小查询或一个带有更多连接或(甚至子查询)的大查询一次获取所有数据。在获得大量数据之前,您不会注意到任何一种情况下的性能差异。

如果您刚刚开始使用 PHP,我建议您坚持使用更易于调试和理解的较小查询。毕竟 MySQL 可以很好地执行小型快速查询。

很快,您将转移到将为您编写查询的ORM(或框架)。您只需要关注您要解决的问题的逻辑即可。

例如在 CakePHP 中你只需要这样做:

$blogs = $this->Blog->find('all')

鉴于Blog 属于User 并且User 可以有多个Subscriptions,所有数据都将“自动”检索(它会自行为连接表生成SQL就像Doglas's answer 中的那个)。

所以现在,我建议专注于构建易于理解调试优化的小型查询 维护

这里是a list of ORMs in PHP。这些很常见:

  1. Eloquent 来自 Laravel 团队。
  2. Propel

还有here is 来自同一博客的关于 ORM 的帖子;)

【讨论】:

  • 不知道这个,看来真的很实用,谢谢,我马上去看看!
猜你喜欢
  • 2019-01-06
  • 2016-11-10
  • 1970-01-01
  • 2020-01-06
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多