子选择或分组

时间:2013-07-22 14:09:12

标签: mysql

你好users表,与另一个表有多对多的关系。

fiddle

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 ...中以使正常结果变得不方便实际数据..以及结构更新。

这种情况下的最佳做法是什么? 如果表变大,速度优化的最佳方案是什么?

1 个答案:

答案 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