Mysql 子选择或分组方式

Mysql 子选择或分组方式,mysql,Mysql,你好,有用户表,与另一个表相关的多对多 显示用户信息+计数(相关项目)的最佳方式是什么? 我试了两个问题。。但它们都有一些缺点: SELECT u.*, (SELECT count(id) FROM user_items WHERE user_id = u.id) as items_count FROM users u; SELECT u.*, COUNT(ui.id) as items_count FROM users u JOIN user_items ui ON ui.user_

你好,有
用户
表,与另一个表相关的多对多

显示用户信息+计数(相关项目)的最佳方式是什么? 我试了两个问题。。但它们都有一些缺点:

SELECT u.*,
 (SELECT count(id) FROM user_items WHERE user_id = u.id) as items_count
FROM users u;


SELECT u.*,
 COUNT(ui.id) as items_count
FROM users u
JOIN user_items ui ON ui.user_id = u.id
GROUP BY u.id, u.name;
子选择查询。。当这张桌子变大时会变得很重

分组查询。。强制我将组中的所有用户字段按。。。为了获得正常的结果,实际数据将变得不方便。。以及结构更新

这种情况下的最佳做法是什么?

另外,如果表变大,速度优化的最佳方案是什么?

实际上,在MySQL中,您不需要通过聚合或分组某个项来将其包含在分组结果集中:

SELECT u.*,
       COUNT(*) as items_count
FROM users u
JOIN user_items ui ON ui.user_id = u.id
GROUP BY u.id
或者,您可以在from子句中的内联视图中分组:

SELECT u.*,
       ui.items_count
FROM users u
JOIN (select user_id, COUNT(*) as items_count 
      from user_items 
      group by user_id) ui 
  ON ui.user_id = u.id
GROUP BY u.id

SQLFiddle。

您想要什么样的结果?(只是为了确定)取决于您想要的结果,如果您只想要统计信息,我应该只使用表user\u items,否则我将加入user+user\u items并计算user\u items。你可以考虑查看这个查询,这样MySQL就可以索引/缓存数据。所有用户列和一个“ItMyStIt计数”,他有“他有”的项目数。正常连接和内联连接的区别是什么?@ D.ReEv:你是什么意思,“像这样的内联连接”?您是指第二个查询吗?当您加入(或从中选择)子查询时,MySQL首先运行子查询,然后使用临时结果集作为表运行查询的其余部分。因此,它只执行一次。。而且可能只获取索引列。。听起来很有趣:)
SELECT u.*,
       ui.items_count
FROM users u
JOIN (select user_id, COUNT(*) as items_count 
      from user_items 
      group by user_id) ui 
  ON ui.user_id = u.id
GROUP BY u.id