将一行优先于另一行(如果存在)

问题描述 投票:0回答:1

我有一个

commission_rates
表,其中包含以下数据:

id 亲切 商户id publisher_id
1 标准 0.15 1
2 标准 0.15 2
3 重复客户 0.1 3
4 定制 0.5 3 408
5 标准 0.08 3

其中

publisher_id
null
的行表示此费率适用于所有发布商。因此,如果我的发布商 ID 为 10,并且我想查看该发布商适用的佣金结果集,它将返回第 1、2、3 和 5 行,即不是第 4 行,因为该行是针对发布商 ID 的费率自定义408.

这个想法是避免为每个商家<>发布者关系明确定义费率。每个发布商 <> 商家的费率 99% 相同,但对于一些定制,两方之间商定了不同的费率。因此,

null
列中的
publisher_id
值意味着这是用于 所有 发布商的费率。

其中

publisher_id
不是
null
的行表示该发布商为商家提供了自定义费率。

例如,第 4 行具有发布商 408 的

custom
费率。如果我们查询发布商 408,则第 4 行应返回所有发布商的 standard 费率(第 5 行)。
因此对发布者 408 的查询将返回:

id1空2空3空4
亲切 商户id publisher_id
标准 0.15 1
标准 0.15 2
重复客户 0.1 3
定制 0.5 3 408
但是对任何其他发布者的查询将返回:

id1空2空3空5空
亲切 商户id publisher_id
标准 0.15 1
标准 0.15 2
重复客户 0.1 3
标准 0.08 3
postgresql
1个回答
0
投票

SELECT * FROM commission_rates outer WHERE kind <> 'standard' OR publisher_id = 408 OR publisher_id IS NULL AND NOT EXISTS( SELECT * FROM commission_rates inner WHERE outer.merchant_id = inner.merchant_id AND inner.publisher_id = 408 );

	
© www.soinside.com 2019 - 2024. All rights reserved.