与多行获取从关系表中的数据
我有这个表:与多行获取从关系表中的数据
博客
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说它真的很慢,所以我现在有点迷路了。
我认为你需要将所有由'连接提示'生成的行进行分组,并用逗号将它们连接起来进行演示。
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;
真的很有帮助,谢谢!但我也希望获得怀疑的信息,因为它会有其他列像日期等。对不起,不能在这个问题上解释这一点。 –
据我所知,在这种情况下,据我所知,你真的需要两个查询 – Doglas
'GROUP_CONCAT'目前运行良好,谢谢! –
你可以做任何一种。几个小的查询或一个大的查询有更多的连接或(甚至子查询)一次获取所有数据。在任何情况下,您都不会注意到任何性能差异,直到您获得大量数据。
如果您刚刚开始使用PHP,我会建议坚持让更小的查询更易于调试和理解。在所有的MySQL都能很好地执行小型快速查询之后。
很快,您将移动到将为您编写查询的ORM(或框架)。你只需要关注你试图解决的问题的逻辑。
例如在CakePHP中,你只需要做到:
$blogs = $this->Blog->find('all')
的,而且是一个Blog
属于一个User
和User
可以有很多Subscriptions
,所有的数据都将被“自动地”恢复(这会自行为连接表生成SQL,如Doglas's answer中的那样)。
就目前而言,我建议把重点放在建立小查询是容易理解,调试,优化和保持。
这里是a list of ORMs in PHP。这些都很常见:
而且here is关于来自同一博客奥姆斯职位;)
我不知道这个,看起来很实用,谢谢,我会尽快看看! –
你使用PHP核心或一些框架? –
@SulthanAllaudeen仅用于数据库处理的PDO –