2015-07-13 17 views
5
Video 
------- 
id 
source_low 
source_med 
source_high 

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

Các mục video có thể chứa ít nhất 1 hay tối đa 3 của nguồn (nguồn thấp, nguồn med, cao nguồn).Lấy giá trị trong bảng là một số cột là null trong MYSQL

Ý tưởng cũng giống như youtube, điều đó có nghĩa là một bản ghi video có thể chứa một số chất lượng. Vì vậy, khi tôi trả về thời lượng/hình thu nhỏ, tôi muốn kiểm tra xem nguồn nào tồn tại và trả về một trong số chúng.

Ví dụ: nếu video có source_low hoặc source_med, điều đó có nghĩa là có thời lượng là & hình thu nhỏ cho source_low và source_med, sau đó tôi chỉ cần trả lại một trong hai.

CodeIgniter cú pháp:

$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 (thumbnail là cùng một cách để có được):

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; 

Ngay bây giờ tôi có thể trả lại toàn bộ kết quả, bao gồm giá trị null, nhưng làm thế nào tôi có thể chỉ trả lại một thời lượng và một hình thu nhỏ?

Cảm ơn vì đã giúp

Cập nhật:

Chỉ cần cập nhật các truy vấn nhưng có vẻ như CodeIgniter có một số sai sót trong xử lý nó, bất kỳ ý tưởng? Cảm ơn

Mã của tôi:

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

Và trong 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

Đây là một câu hỏi hay nhưng khó gỡ lỗi SQL của bạn vì nó chứa trong tất cả các chuỗi 'php' không liên quan. Loại bỏ chúng và chỉ cho chúng tôi thấy SQL và chúng tôi sẽ có thể trợ giúp! – LondonRob

+0

Cảm ơn. xin lỗi vì khó hiểu, đó là truy vấn codeigniter và tôi chuyển nó sang SQL một – user782104

+0

Thông báo lỗi bạn đã thêm không khớp với mã bạn có ở đó. – vhu

Trả lời

6

Bạn có thể sử dụng COALESCE() hàm trả về giá trị null đầu tiên. Xem MySQL manual để biết chi tiết. Ví dụ:

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; 
+0

Cảm ơn, một câu hỏi nữa.Nếu có nhiều hơn 2 giá trị, ví dụ sl.duration và sm.duration đều có giá trị, thì giá trị nào sẽ trả về? – user782104

+2

Đầu tiên, ví dụ ở trên, 'sl .duration' sẽ được trả về luôn luôn nếu nó có giá trị.Nếu nó là null, thì 'sm.duration' sẽ được trả về nếu nó có giá trị' sh.duration' được cố gắng cuối cùng, nếu nó là null thì null sẽ là – vhu

+1

Bạn nên thêm phần thảo luận này vào nội dung câu hỏi, nó hữu ích và có liên quan! – LondonRob

Các vấn đề liên quan