2013-08-12 16 views
0

這是我第二次面對這種問題來檢索數據。在mysql中存儲和獲取多個ID的最佳模式設計

CREATE TABLE `pm_projects` ( 
    `project_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `project_name` varchar(255) NOT NULL, 
    `assigned_client` varchar(100) NOT NULL, 
    `project_detail` longtext NOT NULL, 
    `creation_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `project_status` tinyint(1) NOT NULL, 
    PRIMARY KEY (`project_id`), 
    KEY `assigned_client` (`assigned_client`) 
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 

在上表中,我有一個字段assigned_client保存分配給與逗號分隔的項目(3,4,...)客戶端的多個ID的。

,我試圖與分配的客戶端的名稱(這是我的pm_users表)與JOIN在這個表上獲取結果,我試過如下:

SELECT 
    p.project_id, u.user_name, p.project_name, 
    p.creation_date, p.project_status 
FROM pm_projects p 
LEFT JOIN pm_users u ON u.user_id 
IN (
    'p.assigned_clients' 
) 

,返回NULLu.user_name字段。

我可以不得不改變我的模式,如果是的話怎麼樣?
或者我想用錯誤的查詢?

回答

2

您可以使用find_in_set此:

on find_in_set(u.user_id, p.assigned_clients) > 0; 

注意周圍有沒有p.assigned_clients單引號。這是您的查詢中的另一個錯誤(但即使您使用反引號替換它,查詢仍然無效)。

但是,問題在於你的表模式。您應該有一個單獨的關聯表,每個用戶和分配的客戶端都有一行。

試圖將這一切全部存儲在一個字段中只會導致問題,過於複雜的查詢以及將來的性能問題。

+0

**嘗試存儲這一切都在一個字段只會導致問題,過於複雜的查詢,和未來的性能問題。**這是我想知道的。 –

1

我會採取多對多的連接方式。

喜歡的東西

CREATE TABLE pm_project_client_link(
    project_id INT, 
    client_id INT 
) 

這將允許你編寫查詢類似

SELECT 
    p.project_id, 
    u.user_name, 
    p.project_name, 
    p.creation_date, 
    p.project_status 
FROM pm_projects p INNER JOIN 
     pm_project_client_link pcl ON p.project_id = pcl.project_id INNER JOIN 
     pm_users u ON pcl.client_id = user_id 
相關問題