MySQL получение содержимого из одной таблицы, связанной внешним ключом из другой таблицы - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть две таблицы:

CREATE TABLE users(
    userID int primary key not null auto_increment,
    username varchar(16),
    passcode varchar(16),
    email varchar(50) not null
);

CREATE TABLE favorites(
    userID int not null,
    favID1 varchar(50) not null,
    favID2 varchar(50) not null,
    favID3 varchar(50) not null,
    favID4 varchar(50) not null,
    favID5 varchar(50) not null,
    favID6 varchar(50) not null,
    favID7 varchar(50) not null,
    favID8 varchar(50) not null,
    favID9 varchar(50) not null,
    favID10 varchar(50) not null,
    favID11 varchar(50) not null,
    favID12 varchar(50) not null,
    FOREIGN KEY fk1(userID) REFERENCES users(userID)
);

И я хотел бы получить содержимое таблицы избранного, используя только имя пользователя из таблицы пользователей, как будет выглядеть утверждение для него? Я довольно новичок в SQL и базах данных, поэтому извиняюсь, если это тривиально. Любой другой ресурс, на который я смотрел, не имеет отношения к тому, что я хочу сделать.

1 Ответ

1 голос
/ 27 апреля 2020

У вашей базы данных есть проблемы. Вместо того, чтобы поддерживать отдельные столбцы для каждого избранного, вы должны изменить таблицу favorites таким образом, чтобы в одной записи сохранялась одна и только одна взаимосвязь избранного пользователя:

CREATE TABLE favorites (
    userID int not null,
    favID varchar(50) not null,
    FOREIGN KEY fk1(userID) REFERENCES users(userID)
);

Сейчас , если вы хотите сообщить избранные идентификаторы для данного пользователя, вам нужно использовать только базовое c соединение, например

SELECT
    u.userID,
    u.username,
    GROUP_CONCAT(f.favID ORDER BY f.favID) AS favIDs
FROM users u
LEFT JOIN favorites f
    ON u.userID = f.userID
GROUP BY
    u.userID,
    u.username;

Возможно, самая большая проблема с вашим текущим дизайном таблицы favorites что он допускает только до 12 любимых идентификаторов. Если ваша система когда-либо будет нуждаться в поддержке большего, необходимо изменить саму таблицу, т. Е. Вам потребуется изменение DDL. С моим предложенным дизайном вам нужно будет только добавить больше записей / данных, что является изменением DML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...