-1

値が null でない場合、テーブルの 3 つの列を 1 つに結合しようとしています。これは私のテーブルです:

CREATE TABLE IF NOT EXISTS `roles_map` (
  `rm_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username_a` varchar(45),
  `username_l` varchar(45),
  `username_u` varchar(45),
  `password` varchar(45) NOT NULL,
  `role_id` int(1) NOT NULL,
   PRIMARY KEY (`rm_id`),
   FOREIGN KEY (username_u) REFERENCES users(index_num),
   FOREIGN KEY (username_a) REFERENCES admins(login),
   FOREIGN KEY (username_l) REFERENCES lecturers(id_number),
   FOREIGN KEY (role_id) REFERENCES roles_name(role_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

username_l、username_u、username_a に参加しようとしましたが、1 つだけ値が != null であるためです。

誰かが私を助けることができますか?

4

2 に答える 2

1

CONCATで生成された値を取得するだけの場合は、次のようにすることができます。

SELECT
    CONCAT(
         IFNULL( `username_a` , '' )
        ,IFNULL( `username_l` , '' )
        ,IFNULL( `username_u` , '' )
    )
FROM `roles_map`

ただし、新しい列に保存する場合はusername、最初に列を追加します。

ALTER TABLE `roles_map` ADD `username` VARCHAR( 45 ) NOT NULL DEFAULT '';

次に、次のような UPDATE ステートメントを使用します。

UPDATE `roles_map`
    SET `username` =
        CONCAT(
             IFNULL( `username_a` , '' )
            ,IFNULL( `username_l` , '' )
            ,IFNULL( `username_u` , '' )
        )

JOINするには、次のようなことを試すことができます:

SELECT
    `roles_map`.*
    ,CONCAT(
         IFNULL( `username_a` , '' )
        ,IFNULL( `username_l` , '' )
        ,IFNULL( `username_u` , '' )
    ) AS username
FROM
    `roles_map`
    LEFT OUTER JOIN
        `admins` ON
            `admins`.`login` = 
            CONCAT(
                 IFNULL( `roles_map`.`username_a` , '' )
                ,IFNULL( `roles_map`.`username_l` , '' )
                ,IFNULL( `roles_map`.`username_u` , '' )
            )

リンク : CONCATIFNULL

于 2013-11-09T23:20:24.743 に答える
0

JOINは専門用語で、2 つのテーブル間の相互参照を意味します。次のように、null 以外の値を 1 つだけ選択しようとしているように思えます。

SELECT IFNULL(`username_l`, IFNULL(`username_u`, `username_a`)) AS `username`
FROM `roles_map`
WHERE IFNULL(`username_l`, IFNULL(`username_u`, `username_a`)) = 'admin'
于 2013-11-09T22:49:05.313 に答える