0

这是我第二次遇到此类问题来检索数据。

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,其中包含分配给项目的客户端的多个 id,用逗号分隔 ( 3,4,...)。

我正在尝试使用分配的客户名称(在我的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

我可以更改我的架构吗,如果是,那么如何?
或者我正在尝试错误的查询?

4

2 回答 2

2

您可以find_in_set为此使用:

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

请注意,周围没有单引号p.assigned_clients。这是您查询中的另一个错误(但即使您将其替换为反引号,查询仍然无法正常工作)。

但是,问题在于您的表架构。您应该有一个单独的关联表,每个用户和分配的客户端有一行。

试图将这些全部存储在一个字段中只会导致问题、过于复杂的查询以及未来的性能问题。

于 2013-08-12T11:30:36.787 回答
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
于 2013-08-12T11:31:43.370 回答