2016-04-28 83 views
1

我有这个表:与多行获取从关系表中的数据

博客

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

用户

id 
nickname 
avatar 

suscriptions

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) 

And t再次使用PHP来排序结果。

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

重要的是要记住blog可以有几个subscriptions

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

+0

你使用PHP核心或一些框架? –

+0

@SulthanAllaudeen仅用于数据库处理的PDO –

回答

0

我认为你需要将所有由'连接提示'生成的行进行分组,并用逗号将它们连接起来进行演示。

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; 
+0

真的很有帮助,谢谢!但我也希望获得怀疑的信息,因为它会有其他列像日期等。对不起,不能在这个问题上解释这一点。 –

+0

据我所知,在这种情况下,据我所知,你真的需要两个查询 – Doglas

+0

'GROUP_CONCAT'目前运行良好,谢谢! –

0

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

如果您刚刚开始使用PHP,我会建议坚持让更小的查询更易于调试和理解。在所有的MySQL都能很好地执行小型快速查询之后。

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

例如在CakePHP中,你只需要做到:

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

的,而且是一个Blog属于一个UserUser可以有很多Subscriptions,所有的数据都将被“自动地”恢复(这会自行为连接表生成SQL,如Doglas's answer中的那样)。

就目前而言,我建议把重点放在建立小查询容易理解调试优化保持

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

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

而且here is关于来自同一博客奥姆斯职位;)

+0

我不知道这个,看起来很实用,谢谢,我会尽快看看! –

相关问题