Отношения MYSQL и проблема с запросом

У пользователя много элементов, но элементы имеют много категорий.

Я хочу отобразить таблицу в учетной записи пользователя, которая находит количество элементов для каждого элемента:

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

Я не могу понять... У пользователя есть несколько элементов, но только один идентификатор в пользовательской таблице.

Есть ли в таблице User идентификатор item_id, который затем относится к таблице user_items? Таблица user_items имеет три поля: item_id, имя элемента и количество элементов?

Кто-нибудь помог нублету?

Спасибо


person Jon    schedule 14.10.2012    source источник
comment
Что вы имеете в виду, количество элементов для каждого элемента? Вы имели в виду количество элементов для каждого пользователя или, возможно, количество пользователей для каждого элемента? Также неясно, какое отношение (если вообще) категории имеют к вашему вопросу.   -  person eggyal    schedule 14.10.2012


Ответы (2)


  • Если элемент может «принадлежать» не более чем одному пользователю, просто сохраните непосредственно в таблице 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 как в таблицах user, так и в таблицах item.

    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
    );
    
person eggyal    schedule 14.10.2012

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
person Rick Calder    schedule 14.10.2012