【问题标题】:Combining two tables in a database合并数据库中的两个表
【发布时间】:2013-07-11 07:31:22
【问题描述】:

我做了两张桌子。第一个表保存文件的元数据。

create table filemetadata (
id varchar(20) primary key ,
filename varchar(50),
path varchar(200),
size varchar(10),
author varchar(50)
) ;

+-------+-------------+---------+------+---------+
| id    | filename    | path    | size | author  | 
+-------+-------------+---------+------+---------+
| 1     | abc.txt     | c:\files| 2kb  | eric    | 
+-------+-------------+---------+------+---------+
| 2     | xyz.docx    | c:\files| 5kb  | john    | 
+-------+-------------+---------+------+---------+
| 3     | pqr.txt     |c:\files | 10kb | mike    | 
+-------+-------------+---------+------+---------+

第二个表包含有关上表中特定文件的“收藏”信息。

create table filefav (
fid varchar(20) primary key ,
id varchar(20),
favouritedby varchar(300),
favouritedtime varchar(10),
FOREIGN KEY (id) REFERENCES filemetadata(id) 
) ;

+--------+------+-----------------+----------------+
| fid    | id   | favouritedby    | favouritedtime | 
+--------+------+-----------------+----------------+
| 1      | 1    | ross            | 22:30          | 
+--------+------+-----------------+----------------+
| 2      | 1    | josh            | 12:56          | 
+--------+------+-----------------+----------------+
| 3      | 2    | johny           | 03:03          | 
+--------+------+-----------------+----------------+
| 4      | 2    | sean            | 03:45          | 
+--------+------+-----------------+----------------+

这里的“id”是一个外键。 第二个表格显示了哪个人将哪个文档标记为他/她的最爱。 例如,由 id = 1 表示的文件 abc.txt 已被 ross 和 josh 标记为收藏(参见列 favouritedby)。

所以我想做的是获得一个表格/视图,其中显示如下信息 -

+-------+-------------+---------+------+---------+---------------+
| id    | filename    | path    | size | author  | favouritedby  |
+-------+-------------+---------+------+---------+---------------+
| 1     | abc.txt     | c:\files| 2kb  | eric    | ross, josh    |
+-------+-------------+---------+------+---------+---------------+
| 2     | xyz.docx    | c:\files| 5kb  | john    | johny, sean   |
+-------+-------------+---------+------+---------+---------------+
| 3     | pqr.txt     |c:\files | 10kb | mike    | NULL          |
+-------+-------------+---------+------+---------+---------------+

我如何做到这一点?

【问题讨论】:

标签: mysql sql database database-design database-schema


【解决方案1】:

使用JOIN(从我的脑海中,没有完成检查):

SELECT filemetadata.id, filename, path, size, author, GROUP_CONCAT(favouritedby) 
FROM filemetadata 
LEFT JOIN filefav ON filemetadata.id=filefav.id GROUP BY filemetadata.id

【讨论】:

  • 这不起作用。我想要 'favouritedby' 列中所有喜欢由 id=1 表示的特定文件(比如 abc.txt)的名称,在单个单元格中,如上例所示。
  • @user2492264 这就是它应该做的。那是GROUP_CONCAT。您能否详细说明您的问题,包括您现在的情况、获得的结果以及您的期望?
【解决方案2】:

Select A.*,B.favouritedby FROM filemetadata A Left join (Select id,Group_Concat(favouritedby) from filefav group by id) B ON A.Id=B.Id

【讨论】:

    【解决方案3】:

    创建一个创建两个表的 UNION 的视图:

    CREATE VIEW filefavs AS
    SELECT * FROM filemetadata 
    UNION
    SELECT * FROM filefav 
    

    【讨论】:

    • 没有。他需要JOIN 和GROUP_CONCAT。
    猜你喜欢
    • 2016-07-30
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多