2

ユーザーグループを格納する「group_names」テーブルがあります。各グループにはマネージャーがあり、個々のユーザーにすることも、別のグループによって管理することもできます。これは現在、group_names.mgr_typeによって決定されています。INT値1は、それが個々のユーザーであることを意味し、値2は、それを管理するグループであることを意味します。

たとえば、「一般ユーザー」グループは、「IT部門」グループまたは「JohnDoe」によって管理できます。usersおよびgroup_namesテーブルの一意のIDフィールドは、「user_id」および「group_id」です。

PHPからロジックを取り出して、SQLクエリに入れたいのですが、ここで問題が発生しています。テーブルのレイアウトを考えると、これが可能かどうか、またはドキュメントに記載されている簡単な手順に従うことができないかどうかはわかりません。

SELECT gn.group_id, gn.group_name, ... gn.mgr_id, CONCAT(usr.user_firstname,' ',usr.user_lastname) AS created_name, usr.user_id,
CASE gn.mgr_type
    WHEN '1' THEN CONCAT(usr.user_firstname,' ',usr.user_lastname) WHERE usr.user_id=gn.mgr_id LIMIT 1
    WHEN '2' THEN gn.group_name WHERE gn.group_id=gn.mgr_id LIMIT 1
END AS mgr_name
FROM group_names gn 
LEFT JOIN users usr 
ON gn.created_by=usr.user_id 
ORDER BY group_name ASC;

括弧の有無にかかわらず、IFとCASEのさまざまなバリエーションを試しましたが、「無効な構文」エラーが発生し続けます。

...for the right syntax to use near 'WHERE usr.user_id=gn.mgr_id LIMIT 1) WHEN '2' THEN (gn.group_name WHERE gn' at line 3

同じテーブルから別の行を選択することもできますか(mgr_id = group_idに基づいて別の行からgroup_nameを選択します)、または別のテーブルを追加する必要がありますか?これを行うためのより簡単で効率的な方法に関する提案はありますか?

ありがとう!

4

3 に答える 3

0

これらのテーブルに既に参加しているので、これを試しましたか

CASE gn.mgr_type
    WHEN '1' THEN CONCAT(mgr_usr .user_firstname,' ',mgr_usr .user_lastname)
    WHEN '2' THEN mgr_grp.group_name
END AS mgr_name

それが機能するには、実際にはさらに2つの左結合が必要です

LEFT JOIN users mgr_usr 
   ON gn.mgr_id = mgr_usr.user_id 
LEFT JOIN group_names mgr_grp
   ON gn.mgr_id = mgr_grp.group_id

ユーザーの場合は user テーブルに左結合してマネージャー名を取得するか、グループの場合は group_names テーブルに結合してグループ名を取得します

JOINをさらに制限できます

LEFT JOIN users mgr_usr 
   ON gn.mgr_id = mgr_usr.user_id AND gn.mgr_type = 1
LEFT JOIN group_names mgr_grp
   ON gn.mgr_id = mgr_grp.group_id AND gn.mgr_type = 2
于 2012-10-21T17:43:18.253 に答える
0

これを試して:

SELECT ...
CASE WHEN gn.mgr_type = '1' 
    THEN CONCAT(usr.user_firstname,' ',usr.user_lastname) WHERE usr.user_id=gn.mgr_id LIMIT 1
    ELSE gn.group_name WHERE gn.group_id=gn.mgr_id LIMIT 1
    END AS mgr_name
FROM group_names gn...
于 2012-10-21T17:43:48.553 に答える
0

このようなことを試してみるべきだと思います(テーブルの別のインスタンスの結合条件のどこにシフトしてみてください):

 SELECT gn.group_id, gn.group_name, ... gn.mgr_id,
        CONCAT(usr.user_firstname,' ',usr.user_lastname) AS created_name, 
        usr.user_id,
       CASE gn.mgr_type
         WHEN '1' THEN CONCAT(usr1.user_firstname,' ',usr1.user_lastname)
         WHEN '2' THEN gn1.group_name
      END AS mgr_name
 FROM group_names gn 
 LEFT JOIN users usr 
 ON gn.created_by=usr.user_id
 RIGHT OUTER JOIN users usr1
 ON usr1.user_id=gn.mgr_id LIMIT 1
 OUTER JOIN group_names gn1
 ON usr.user_id=gn1.mgr_id LIMIT 1
 ORDER BY group_name ASC;
于 2012-10-21T17:38:58.477 に答える