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

5
Video
-------
id
source_low
source_med
source_high

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

视频项目可以包含至少1个最多3个源(source low,source med,source high)。
这个想法与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

1
这是一个好问题,但是由于SQL语句被包含在所有那些无关紧要的php字符串中,所以很难调试。去掉它们,只显示SQL语句,我们就能够提供帮助了! - LondonRob
谢谢。抱歉让你感到困惑,这是Codeigniter查询,我将其转换为SQL查询。 - user782104
你添加的错误信息与你所拥有的代码不匹配。 - vhu
你的代码中有 v.*, COALESCE(...,但是在错误信息中却出现了 t.namet.name_tw 等。 - vhu
谢谢, 在CodeIgniter中只需将false作为第二个参数添加到select查询中即可。 - user782104
1个回答

6
您可以使用COALESCE()函数返回第一个非空值。有关详细信息,请参见MySQL的手册。例如:
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都有值,那么哪一个会被返回? - user782104
2
在上面的例子中,如果sl.duration有值,它将始终被返回。如果它为空,则返回sm.duration(如果它有值)。最后尝试sh.duration,如果它也为空,则返回null。 - vhu
1
你应该将这个讨论添加到问题正文中。它很有用且相关! - LondonRob
当然可以。您介意看一下更新后的问题吗? - user782104

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接