【问题标题】:mysql join column if value is not null如果值不为空,则mysql连接列
【发布时间】:2013-11-09 22:44:48
【问题描述】:

如果值不为空,我尝试将表中的 3 列合并为一列。这是我的桌子:

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,因为只有一个有值!= null。

有人可以帮帮我吗?

【问题讨论】:

  • 你有没有尝试过?

标签: mysql join notnull


【解决方案1】:

如果您只想检索 CONCATenated 值,您可以这样做:

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

要加入你可以尝试这样的事情:

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

【讨论】:

  • 这两个选项都不错,但接下来我需要像这样使用:SELECT CONCAT(IFNULL(username_a,''),IFNULL(username_l,''),IFNULL(@987654331 @ , '' ) ) as concat FROM roles_map where concat = 'admin' 我该怎么做?我不能使用新列;/
【解决方案2】:

JOIN 是一个技术术语,意思是两个表之间的交叉引用。听起来您只是想选择一个非空值,如下所示:

SELECT IFNULL(`username_l`, IFNULL(`username_u`, `username_a`)) AS `username`
FROM `roles_map`
WHERE IFNULL(`username_l`, IFNULL(`username_u`, `username_a`)) = 'admin'

【讨论】:

  • 两个选项都不错,但接下来我需要这样使用:SELECT CONCAT( IFNULL( username_a , '' ) ,IFNULL( username_l , '' ) ,IFNULL( @987654325 @ , '' ) ) as concat FROM roles_map where concat = 'admin' 我该怎么做?我不能使用新列;/
  • 查看我的编辑。请注意,这不是一个很好的方法,因为它不能很好地利用索引。如果可能的话,最好重新组织数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 2016-06-24
相关资源
最近更新 更多