获取MYSQL中某列为空的表中的值

Posted

技术标签:

【中文标题】获取MYSQL中某列为空的表中的值【英文标题】:Get the value in the table that some column is null in MYSQL 【发布时间】:2015-10-01 12:26:07 【问题描述】:
Video
-------
id
source_low
source_med
source_high

Source
--------
id
duration
thumbnail

视频项可以包含至少 1 个最多 3 个源(低源、中源、高源)。

这个想法与 youtube 相同,这意味着视频记录可以包含多种质量。因此,当我返回持续时间/缩略图时,我想检查哪个源存在并返回其中一个。

例如,如果视频有 source_low 或 source_med ,这意味着 source_low 和 source_med 有持续时间和缩略图,那么我只需要返回其中一个。

Codeigniter 语法:

  $this->db->select('v.*, sl.duration, sm.duration as duration_m, sh.duration as duration_h, sl.thumbnail, sm.thumbnail as thumbnail_m, sh.thumbnail as thumbnail_h');
        $this->db->from('video as v');
        $this->db->join('source as sl', 'v.source_low = sl.video_id', 'left');
        $this->db->join('source as sm', 'v.source_med = sm.video_id', 'left');
        $this->db->join('source as sh', 'v.source_high = sh.video_id', 'left');
        $this->db->group_by('v.id');

SQL(缩略图获取方式相同):

SELECT v.*, sl.duration, sm.duration as duration_sm, sh.duration as duration_sh
    FROM video as v
    LEFT JOIN source as sl ON (v.source_low = sl.video_id)
    LEFT JOIN source as sm ON (v.source_med = sm.video_id)
    LEFT JOIN source as sh ON (v.source_high = sh.video_id)
    GROUP BY v.id;

现在我可以返回所有的结果,包括空值,但是我怎样才能只返回一个持续时间和一个缩略图呢?

感谢您的帮助

更新:

只需更新查询,但似乎 codeigniter 在处理它时出现了一些错误, 任何想法?谢谢

我的代码:

$this->db->select('v.*, COALESCE(b.duration, bt.duration, bc.duration) AS duration, COALESCE(b.thumbnail, bt.thumbnail, bc.thumbnail) AS thumbnail');

在 SQL 中:

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near 'AS duration, COALESCE(b.thumbnail, `bt`.`thumbnail`, `bc`.`thumbnail)` AS thumbn' at line 1

SELECT `v`.*, `t`.`name`, `t`.`name_tw`, `t`.`name_cn`, COALESCE(b.duration, `bt`.`duration`, `bc`.`duration)` AS duration, COALESCE(b.thumbnail, `bt`.`thumbnail`, `bc`.`thumbnail)` AS thumbnail FROM (`video` as v) JOIN `teacher` as t ON `v`.`teacher_id` = `t`.`id` LEFT JOIN `brightcove` as b ON `v`.`video` = `b`.`video_id` LEFT JOIN `brightcove` as bt ON `v`.`video_tw` = `bt`.`video_id` LEFT JOIN `brightcove` as bc ON `v`.`video_cn` = `bc`.`video_id` WHERE `v`.`is_delete` = 0 AND `v`.`type` = 0 GROUP BY `v`.`id` ORDER BY `v`.`start_date` desc

【问题讨论】:

这是一个很好的问题,但是很难调试您的 SQL,因为它包含在所有不相关的 php 字符串中。摆脱这些,只需向我们展示 SQL,我们就能提供帮助! 谢谢。很抱歉造成混淆,它是 codeigniter 查询,我将其转换为 SQL one 您添加的错误消息与您那里的代码不匹配。 你的代码有v.*, COALESCE(...,但在错误信息上你有t.namet.name_tw等等 谢谢,在 codeigniter 中,只需在 select 查询中添加 false 作为第二个参数即可 【参考方案1】:

您可以使用COALESCE()function 返回第一个非空值。有关详细信息,请参阅 MySQL manual。例如:

SELECT v.*, COALESCE(sl.duration, sm.duration, sh.duration) AS duration
    FROM video as v
    LEFT JOIN source as sl ON (v.source_low = sl.video_id)
    LEFT JOIN source as sm ON (v.source_med = sm.video_id)
    LEFT JOIN source as sh ON (v.source_high = sh.video_id)
    GROUP BY v.id;

【讨论】:

谢谢,还有一个问题。如果有超过 2 个值,例如sl.duration 和 sm.duration 都有一个值,那么返回哪个呢? 第一个。在上面的示例中,如果 sl.duration 有值,它将始终返回。如果它为空,那么sm.duration 将被返回,如果它有值。 sh.duration 最后尝试,如果它也为 null 则返回 null。 您应该将此讨论添加到问题的正文中。它有用且相关! 当然。您介意看看更新后的问题吗?

以上是关于获取MYSQL中某列为空的表中的值的主要内容,如果未能解决你的问题,请参考以下文章

MySql 更新update表中某一个字段记录

与从 2 个不为空的表中获取数据相关的数据库查询

如何在mysql中获取值不为null的列名

excel 怎样筛选出 有一个值为空的行

数据库中如何查找日期为空的数据

sql进阶-筛选库表中数据为空的表