2016-07-19 76 views
0

我正在建立一個網站,允許用戶上傳他們製作的電視節目的海報。其他用戶可以將自己添加到海報中,如果他們參與了製作,他們的名字也會列在海報下方。跨三個表的Mysql查詢?

我在編寫mysql查詢時會遇到問題,這將允許我列出所有上傳的海報,但也列出了自己列爲參與生產的任何用戶。我做了這個sql fiddle,可能有幫助。當前查詢顯示所有上傳的海報,但不包括那些已將自己添加到海報中的海報。有任何想法嗎?

查詢

SELECT tbl_uploads.file_name, tbl_users.user_id, tbl_users.user_name, tbl_collab.collab_userid, tbl_collab.collab_username 
    FROM tbl_uploads 

left join tbl_collab on tbl_collab.file_name = tbl_uploads.file_name 

left join tbl_users on tbl_uploads.user_id = tbl_users.user_id 
group by tbl_uploads.file_name 

的表格

CREATE TABLE IF NOT EXISTS `tbl_users` (
    `user_id` int(11) NOT NULL, 
    `user_name` varchar(25) NOT NULL, 
    `user_email` varchar(60) NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; 

INSERT INTO `tbl_users` (`user_id`, `user_name`,`user_email`) VALUES 
(2, 'julian', '[email protected]'), 
(3, 'bob', '[email protected]'), 
(4, 'sue', '[email protected]'); 

CREATE TABLE IF NOT EXISTS `tbl_uploads` (
    `id` int(10) NOT NULL, 
    `file_name` varchar(100) NOT NULL, 
    `user_id` int(11) NOT NULL 
) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=latin1; 

INSERT INTO `tbl_uploads` (`id`, `file_name`, `user_id`) VALUES 
('7', 'Julians Picture','2'), 
('13', 'Julians 2nd picture','2'), 
('14', 'Bobs Picture','3'), 
('15', 'Another Picture','3'); 


CREATE TABLE IF NOT EXISTS `tbl_collab` (
    `id` int(11) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `collab_username` varchar(255) NOT NULL, 
    `file_name` varchar(255) NOT NULL, 
    `collab_userid` varchar(255) NOT NULL 
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=latin1; 

INSERT INTO `tbl_collab` (`id`,`file_name`,`collab_userid`, `user_id`,`collab_username`) VALUES ('1','Bobs Picture','4','4','Sue'), ('2','Another Picture','3','3','Bob') 
,('3','Bobs Picture','2','2','Julian'); 
+1

您想查看所有'collab'條目,但是您通過上傳對結果進行分組。不幸的是,MySQL足夠寬容,不會拋出錯誤,但通過分組,您將省略除第一次上載以外的所有內容(我不確定它是否是真正的第一個或僅僅是第一個)。只需刪除「GROUP BY」一行,你應該沒問題。看看本作更多:https://blog.jooq.org/2012/08/05/mysql-bad-idea-384/ – hsan

+0

我仍然無法弄清楚如何正確地權的SQL那並不是查詢儘管遵循你的建議,但仍然會產生重複。 – JulianJ

+0

重複是什麼意思?當然,如果在協作表中有多個條目,那麼同樣的'file_name'會出現多次。但這正是你所要求的,以獲得所有合作者。請更新您的問題與預期的輸出,使其更清晰你正在尋找。 – hsan

回答

0

這做了什麼,我一直在尋找。 GROUP_CONCAT伎倆

SELECT up.file_name, GROUP_CONCAT(c.collab_username) 
FROM tbl_uploads up 
LEFT JOIN tbl_users p ON up.user_id = p.user_id 
LEFT JOIN tbl_collab c ON up.file_name = c.file_name 
GROUP BY up.file_name