我有一个像这样的表结构
+----+-----------+--------+
| 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 |
+----+--------+
答案 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;