如何通过ID引用不同的表?

时间:2018-03-06 14:14:40

标签: mysql sql

我有一个主表需要保存对其他表的引用 表用户有一个ID,另一个表有REF_ID。

Table users
===========
ID   TABLE_ID   REF_ID  NAME
============================
1    1          1       John
2    2          20      Stacey
.    .          .       .
.    .          .       .
n    2          324     Ben

Table Posts(1)
===========
ID   TITLE
===========
1    "hey there!"
2    "what's up?"
.    .
.    .
n    "Look what I found!"

Table Comments(2)
===========
ID   CONTENT
===========
1    "yes, looks amazing"
2    "Wow!"
.    .
.    .
n    "yep"

主表包含很长的用户列表。每个都有帖子或评论。 我的问题是我如何与他们合作?

  1. 要插入:我想我应该提交2个不同的查询来插入,首先是插入到相关的帖子/评论表,获取lastInsertId,然后将该ID提供给主要的refs表,正确的吗?

  2. 如何在一个查询中仅使用主表(用户)ID' ,获取相关信息以及我从哪个表中获取相关信息,例如:

    ID   REF_ID   NAME   TITLE
    1    1        John   "hey there!"  
    

3 个答案:

答案 0 :(得分:2)

首先你有一个糟糕的设计,要解决它现在你必须这样做:

 SELECT u.ID,   u.REF_ID,   u.NAME,   p.TITLE
 FROM users u
 JOIN posts p
   ON u.ref_id = p.ID
 WHERE u.TABLE_ID = 1 

 UNION ALL

 SELECT u.ID,   u.REF_ID,   u.NAME,   c.CONTENT
 FROM users u
 JOIN comments c
   ON u.ref_id = c.ID
 WHERE u.TABLE_ID = 2

更好的设计应该在同一张桌子上加入帖子和评论

表用户

ID   REF_ID  NAME

表格

REF_ID  TYPE_ID TITLE

这样您的REF_ID就是唯一的。在您的版本中,您可以使用Ref_id = 1,它可以在表格Post或表格注释中。

Type_id可以是1或2,具体取决于帖子或评论。如果需要,还允许您稍后添加其他类型。在之前的模型中,您需要添加一个新表。

最后,查询变得更容易:

 SELECT u.ID,   u.REF_ID,   u.NAME,   p.TITLE
 FROM users u
 JOIN posts p
   ON u.ref_id = p.ID
 -- WHERE u.TYPE_ID = 1   // optional 

答案 1 :(得分:0)

1-我不明白这个问题,对不起。

2-这是联接的原则:

SELECT u.ID, u.REF_ID, u.Name, p.Title
FROM users u
INNER JOIN posts p ON p.ID = u.REF_ID

答案 2 :(得分:0)

访问https://docs.microsoft.com/en-us/sql/relational-databases/tables/primary-and-foreign-key-constraints

你必须制作" ID"作为主要和" REF_ID"作为外键。 主表的外键将是其他两个表的主键。 很简单,你必须在这些表之间建立关系。

访问https://www.tutorialspoint.com/sql/pdf/sql-foreign-key.pdf 关于表关系的更多信息。