MYSQL如果不存在则选择特定行或第一行

时间:2017-09-25 09:19:55

标签: mysql

我有一张不同日期的文本表。每个都由服务,变体,页面和子页面ID索引。

我需要获取给定服务,页面和子页面的所有条目。即每个变化!但是如果特定的特定子页面不存在,我需要它来获取该页面的第一个子页面,而不是该变量的任何内容。

这是我的代码 -

SELECT * FROM frames f
LEFT JOIN varients v ON f.varient_id = v.varient_id AND f.service_id = v.service_id
ẀHERE f.service_id = :sid 
AND f.frame_id = :fid 
AND (f.subframe_id = :subid 
    OR f.subframe_id = (
        select min(subframe_id) from frames ff 
        ẀHERE ff.service_id = f.service_id
            AND ff.varient_id = f.varient_id AND ff.frame_id = f.frame_id
            )
        )
GROUP BY f.service_id, f.varient_id, f.frame_id
ORDER BY f.service_id, v.varient_date, f.frame_id, f.subframe_id

但是,即使特定值存在,这通常也会给出最小值而不是特定值。我非常确定OR不是我需要的......

根据其他一些答案,我尝试过与UNION合作,但由于我想要的不仅仅是一个结果,我似乎无法解决这个问题!

感谢您的帮助..

1 个答案:

答案 0 :(得分:0)

行。我设法实现了我想要的。两天搞乱了这个,最后在发布问题后解决了。我得到了一个相关的'问题,虽然没有给我答案,但让我以不同的方式思考 -

我基本上把整个事情彻底改变了:因为我只想要每个变体一个结果,所以我用它作为主表。然后加入了'框架'表格两次,一次是特定值,一次是第一个值(使用搜索MIN()找到。)如果第一个没有找到,则使用IFNULL返回第二个记录。针对WHERE中的第二条记录进行额外的IS NOT NULL检查,以避免返回任何没有存储针对变体记录的内容。

SELECT v.service_id, v.varient_id, IFNULL(f.frame_id,ff.frame_id)as frame_id,
        IFNULL(f.subframe_id,ff.subframe_id) as subframe_id , IFNULL(f.frameunique, ff.frameunique) as frameunique, IFNULL(f.frame_content,ff.frame_content) as framecontent
 FROM varients v
LEFT JOIN `frames` f ON `f`.`varient_id` = `v`.`varient_id` AND `f`.`service_id` = `v`.`service_id` AND  `f`.`frame_id` = 698 AND `f`.`subframe_id` = 0004
LEFT JOIN `frames` ff ON `ff`.`varient_id` = `v`.`varient_id` AND `ff`.`service_id` = `v`.`service_id` AND  `ff`.`frame_id` = 698
AND `ff`.`subframe_id` = (select min(`subframe_id`) from `frames` `fff` where `fff`.`service_id` = `v`.`service_id`
 AND `fff`.`varient_id` = `v`.`varient_id` AND `fff`.`frame_id` = 698 )

where `v`.`service_id` = 3 AND ff.frameunique IS NOT NULL
ORDER BY `f`.`service_id`, `v`.`varient_date`, `f`.`frame_id`, `f`.`subframe_id`

发布此内容以防其他人帮助。它仍然需要整理,但它的工作原理。感谢您的评论。 :)