【问题标题】:MYSQL Relationships and Query issueMYSQL 关系和查询问题
【发布时间】:2012-10-14 18:13:05
【问题描述】:

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

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

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

我搞不定...用户有多个项目,但用户表中只有一个标识符

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

有人帮忙解决吗?

谢谢

【问题讨论】:

  • 每个项目的项目数”是什么意思?您的意思是“每个用户的项目数”,还是“每个项目的用户数”?也不清楚(如果有的话)“类别”与您的问题有什么关系。

标签: php mysql relationship


【解决方案1】:
  • 如果一个项目最多可以“属于”一个用户,只需在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 join

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

    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;
    

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

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

    CREATE TABLE user (
      user_id SERIAL PRIMARY KEY,
      item_id BIGINT UNSIGNED      -- don't do this
    );
    

【讨论】:

    【解决方案2】:

    用户 - 仅存储用户信息, 项目 - 仅存储项目信息, 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多