你好users
表,与另一个表有多对多的关系。
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY,
name varchar(50)
);
;
CREATE TABLE items (
id INT NOT NULL PRIMARY KEY,
name varchar(50)
);
CREATE TABLE user_items (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id int NOT NULL,
item_id int NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (item_id) REFERENCES items(id)
)
显示用户信息+计数(相关项目)的最佳方式是什么? 我尝试了2个查询..但它们都有一些缺点:
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;
当这些表变大时,子选择查询将变得很重..(并且他们会)。
分组查询..迫使我将所有用户字段放在GROUP BY ...中以使正常结果变得不方便实际数据..以及结构更新。
这种情况下的最佳做法是什么? 如果表变大,速度优化的最佳方案是什么?
答案 0 :(得分:1)
实际上,在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 here。