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