这是我的简化方案。 我在“ store_config”表中有数据库记录:
ID store_id value
1 0 val1
2 10 val2
3 7 val3
4 99 val4
所有记录都是可选的-可能存在或可能不存在。
store_id列是唯一的。
我要运行查询:
WHERE store_id=?
因此: 查询应返回与查询参数中的store_id匹配的值(如果存在),否则应返回与store_id 0匹配的值。
storeId = 0记录被视为默认值,并且仅在提供的storeId查询参数不存在记录的情况下才返回。这就是背后的逻辑。
答案 0 :(得分:2)
您可以使用order by
和limit
:
select t.*
from t
where store_id in (@store_id, 0)
order by store_id desc
limit 1;
这假设(由您的问题暗示),表中每个商店ID只有一行。如果不是这种情况,则可能需要一个更复杂的版本:
select t.*
from t
where store_id = @store_id
union all
select t.*
from t
where store_id = 0 and
not exists (select 1 from t t2 where t2.store_id = @store_id);
答案 1 :(得分:2)
这是使用LIMIT
技巧的一种方法:
SELECT ID, store_id, `value`
FROM store_config
WHERE store_id IN (0, 10)
ORDER BY store_id DESC
LIMIT 1;
这里的窍门是,如果存在ID=10
,则其记录将被保留。如果{em> em 不存在ID=10
,但是存在ID=0
,则该记录将被保留。否则,结果集将为空。
答案 2 :(得分:0)
请尝试这个。
SELECT (IFNULL((SELECT store_id FROM @tbl Where id = @store_id LIMIT 1),0))