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 に答える