0

データを取得するためにこの種の問題に直面するのはこれが 2 回目です。

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'
)

NULLフィールドの値を返しますu.user_name

スキーマを変更する必要がありますか? はいの場合、どうすればよいですか?
または、間違ったクエリで試していますか?

4

2 に答える 2

2

これに使用できますfind_in_set

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

を一重引用符で囲まないことに注意してくださいp.assigned_clients。これは、クエリの別のエラーです (ただし、逆引用符に置き換えても、クエリは機能しません)。

ただし、問題はテーブル スキーマです。ユーザーと割り当てられたクライアントごとに 1 つの行を持つ、別の関連付けテーブルが必要です。

これをすべて 1 つのフィールドに格納しようとすると、問題、過度に複雑なクエリ、および将来のパフォーマンスの問題が発生するだけです。

于 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 に答える