0

用户有很多项目,但项目有很多类别。

我希望在用户帐户中显示一个表格,以查找每个项目的项目数:

-------------------------------
| Item Name | Number of Items |
-------------------------------
|  Item 1   |        24       |
|  Item 2   |        18       |
|  Item 3   |        6        |
-------------------------------

我无法解决...用户有多个项目,但用户表中只有一个标识符

User 表是否有一个与 user_items 表相关的 item_id?user_items 表有三个字段:item_id、item name 和item 个数?

有人帮忙解压吗?

谢谢

4

2 回答 2

0
  • 如果一个项目最多可以“属于”一个用户,只需在item表中直接存储一个 FK 到user表中:

    CREATE TABLE item (
      item_id   SERIAL PRIMARY KEY,
      item_name VARCHAR(20),
      user_id   BIGINT UNSIGNED, -- NOT NULL if every item must belong to a user
      FOREIGN KEY (user_id) REFERENCES user (user_id)
    );
    

    然后,获取每个用户的项目数:

    SELECT user_id, COUNT(*) AS num_items FROM item GROUP BY user_id;
    

    如果您还希望从user表中获取关联的用户信息,您只需要执行SQL 连接

    SELECT   user.*, COUNT(*) AS num_items
    FROM     user JOIN item USING (user_id)
    GROUP BY user_id;
    
  • 如果一个项目可以同时“属于”多个用户,请将user_items表 FK 存储到 theuseritem表中。

    CREATE TABLE user_items (
      item_id BIGINT UNSIGNED NOT NULL,
      user_id BIGINT UNSIGNED NOT NULL,
      FOREIGN KEY (item_id) REFERENCES item (item_id),
      FOREIGN KEY (user_id) REFERENCES user (user_id)
    );
    

    然后获取每个用户的项目数:

    SELECT user_id, COUNT(*) AS num_items FROM user_items GROUP BY user_id;
    

    或者,相反,每个项目的用户数:

    SELECT item_id, COUNT(*) AS num_users FROM user_items GROUP BY item_id;
    

    同样,您可以根据需要执行 aJOIN从其他表中获取相关信息。

  • 除非用户最多可以拥有一项,否则不要在user表中将 FK 存储到表中。item

    CREATE TABLE user (
      user_id SERIAL PRIMARY KEY,
      item_id BIGINT UNSIGNED      -- don't do this
    );
    
于 2012-10-14T10:00:01.297 回答
0

Users - 仅存储用户信息,Items - 仅存储项目信息,User_items - 存储 userId 和 itemId

基本查询如下所示,然后您可以按项目显示结果。SELECT * 返回所有表中的所有行。因此,您将获得所有用户、项目和 user_items 信息。

SELECT * FROM user_items
JOIN items on user_items.itemId = items.itemId
WHERE userId = $yourUserID
GROUP BY itemId
于 2012-10-14T10:11:48.210 回答