2

你好有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 ... 中以获得正常结果,这对于真实数据和结构更新来说变得不方便。

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

4

1 回答 1

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在这里

于 2013-07-22T14:17:32.423 回答