Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中存储和获取多个ID的最佳模式设计_Mysql_Database Schema - Fatal编程技术网

在mysql中存储和获取多个ID的最佳模式设计

在mysql中存储和获取多个ID的最佳模式设计,mysql,database-schema,Mysql,Database Schema,这是我第二次面对这种问题来检索数据 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, `cr

这是我第二次面对这种问题来检索数据

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\u client
,该字段保存分配给项目的客户机的多个id,以逗号分隔(
3,4,…

我正在尝试使用
JOIN
获取此表上的结果,该表具有指定的客户端名称(即在我的
pm\u用户
表上),我尝试了以下操作:

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'
)
返回
u.user\u name
字段的
NULL

我是否必须更改架构,如果是,如何更改?

或者我尝试了错误的查询

您可以使用
find_in_set
进行以下操作:

on find_in_set(u.user_id, p.assigned_clients) > 0;
请注意,
p.assigned\u clients
周围没有单引号。这是查询中的另一个错误(但即使将其替换为反引号,查询仍然无法工作)

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


尝试将这些内容全部存储在一个字段中只会导致将来出现问题、过于复杂的查询和性能问题。

您可以使用
find\u in\u set
实现以下目的:

on find_in_set(u.user_id, p.assigned_clients) > 0;
请注意,
p.assigned\u clients
周围没有单引号。这是查询中的另一个错误(但即使将其替换为反引号,查询仍然无法工作)

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


尝试将这些内容全部存储在一个字段中只会导致将来出现问题、过于复杂的查询和性能问题。

我将采用多对多链接的方法

差不多

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
这将允许您编写类似以下内容的查询

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

我将采用多对多链接方法

差不多

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
这将允许您编写类似以下内容的查询

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
试图将所有这些存储在一个字段中只会在将来导致问题、过于复杂的查询和性能问题。这就是我想知道的。试图将所有这些存储在一个字段中只会导致问题、过于复杂的查询以及将来的性能问题。这就是我想知道的。