优先考虑存在版本的某些行

时间:2016-10-21 18:13:08

标签: mysql sql innodb

我有一个用户定价表

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

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
                                );