我有一个用户定价表
pid | price | service | package | interval | user
1 | 1 | 1 | 10 | w | 0
2 | 4 | 1 | 10 | m | 0
3 | 3 | 1 | 10 | m | 1
4 | 2 | 1 | 20 | w | 0
5 | 8 | 1 | 20 | m | 0
6 | 5 | 1 | 25 | w | 0
7 | 20 | 1 | 25 | m | 0
8 | 4 | 1 | 25 | w | 1
9 | 4 | 1 | 15 | w | 1
10 | 16 | 1 | 15 | m | 1
0行包含每个人的一般价格。现在我有时会给某些用户打折。此价格将以用户身份标识用户。
现在我想要一个选择用户所有价格的查询。它应该取用户为0的所有价格或者用户是用户id的所有价格,但如果有一行作为用户为0而用户id为用户,则应该只将用户ID作为用户的行。< / p>
SELECT * FROM `prices` WHERE user = 0 OR user = 1 AND [...]
应该返回
pid | price | service | package | interval | user
1 | 1 | 1 | 10 | w | 0
3 | 3 | 1 | 10 | m | 1
4 | 2 | 1 | 20 | w | 0
5 | 8 | 1 | 20 | m | 0
7 | 20 | 1 | 25 | m | 0
8 | 4 | 1 | 25 | w | 1
9 | 4 | 1 | 15 | w | 1
10 | 16 | 1 | 15 | m | 1
答案 0 :(得分:0)
您可以使用union all
执行此操作。首先选择用户的所有价格。然后从用户0中选择不匹配的所有价格。您的问题不清楚价格是多少。这是一个猜测:
select p.*
from prices p
where p.user = 1
union all
select p.*
from prices p
where p.user = 0 and not exists (select 1
from prices p2
where p2.service = p.service and
p2.package = p.package and
p2.interval = p.interval and
p2.user = 1
);