MySQL 从一个表中获取由另一个表的外键关联的内容

Posted

技术标签:

【中文标题】MySQL 从一个表中获取由另一个表的外键关联的内容【英文标题】:MySQL getting contents from one table that is related by a foreign key from another table 【发布时间】:2020-08-10 15:27:45 【问题描述】:

我有两张桌子:

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)
);

我想只使用 users 表中的用户名来获取收藏夹表的内容,它的语句会是什么样子?我对 SQL 和数据库还很陌生,所以如果这是微不足道的,我深表歉意。我看过的所有其他资源似乎都与我想做的事情无关。

【问题讨论】:

您可能希望在两个表中加入两个表的基础 userID 列,并显示用户名和收藏夹表的内容。 这能回答你的问题吗? mysql join with where clause 有显示相同情况的示例代码,OP 只是试图在此之外添加一个额外的步骤 【参考方案1】:

您的数据库设计存在一些问题。您应该修改favorites 表,以便单个记录存储一个且仅一个用户-最喜欢的关系,而不是为每个收藏夹维护单独的

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

现在,如果您想报告给定用户的收藏 ID,您只需要使用基本连接,例如

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 个喜爱的ID。如果您的系统需要支持更多功能,则必须修改表本身,即您需要更改 DDL。使用我建议的设计,您只需要添加更多记录/数据,这是 DML 更改。

【讨论】:

正确(当然)。收藏夹的排列顺序可能具有某种意义,而您当前的模型会忽略这一点。 @Strawberry 您的回答也未能解决这一点,因为您从未发布过答案。 好的。隔离情况如何? @Strawberry 老实说,在被困在家里和被困在办公室之间做出选择是一件很难的事情。至少,在新加坡,他们允许你在户外无限制地锻炼,所以我们不会发疯。 谢谢,我试试看。只是另一个问题,这个收藏夹表只是为了将 id 存储到另一个餐桌的餐桌(有餐厅信息),但我很好奇,在这个收藏夹表中保存餐厅信息会更容易吗?另外,我可以为最喜欢的表中的 id 实现自动递增(插入顺序很重要)吗?

以上是关于MySQL 从一个表中获取由另一个表的外键关联的内容的主要内容,如果未能解决你的问题,请参考以下文章

PHP Laravel 根据投票表的外键从问题表中获取所有问题

mysql外键

MySQL如何同时删除主外键关联的两张表中的数据

MySQL:数据管理

hive建立数据仓库 事实表的外键和维度表主键怎么关联 啥命令

无法从 Laravel Vue 通讯录项目中的外键表中获取数据