如果没有找到行,mysql返回默认行

时间:2017-02-06 18:08:45

标签: mysql

我有一个像这样的表结构

+----+-----------+--------+
| id | attr      | value  |
+----+-----------+--------+
|  1 | attr1     | val1   |
|  2 | attr1     | val2   |
|  2 | default   | val3   |
|  3 | default   | val4   |
+----+-----------+--------+

这里,(id,attr)是主键。此外,id(int),attr(varchar),value(varchar)。

我想设计一个查询,以便对于id的所有不同值,我可以获取特定属性的值,如果该属性不存在但是作为默认值存在,则返回该默认值。 i_e结果在上表中,对于attr1将是

+----+--------+
| id | value  |
+----+--------+
|  1 | val1   |
|  2 | val2   |
|  3 | val4   |
+----+--------+

3 个答案:

答案 0 :(得分:2)

实现此目的的一种方法是将两个查询与UNION组合在一起。

第一个查询获取给定属性的结果,第二个查询获取没有给定属性的ID的默认结果。

例如:

select id, value 
from your_table
where attr = 'attr1'
union 
select t1.id, t1.value 
from your_table t1
where t1.attr = 'default'
and not exists (select NULL from your_table t2 where t2.id = t1.id and t2.attr = 'attr1')

答案 1 :(得分:1)

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL, attr VARCHAR(12) NOT NULL,value  VARCHAR(12) NOT NULL,PRIMARY KEY(id,attr));

INSERT INTO my_table VALUES
(1 ,'attr1','val1'),
(2 ,'attr1','val2'),
(2 ,'default','val3'),
(3 ,'default','val4');

SELECT DISTINCT a.id
              , COALESCE(b.value,a.value) value
           FROM my_table a 
           LEFT 
           JOIN my_table b 
             ON b.id = a.id 
            AND b.attr = 'attr1';

+----+-------+
| id | value |
+----+-------+
|  1 | val1  |
|  2 | val2  |
|  3 | val4  |
+----+-------+

答案 2 :(得分:0)

如果你想在默认的attr中找到具有最大id的行,并且这样做,那就试试这个

select t1.*
from t t1 inner join (
    select attr, max(id) id
    from t
    group by attr
) t2 on t1.attr = t2.attr
and case when t1.attr = 'default' then t2.id else t1.id end = t1.id;