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

标签 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 行包含每个人的一般价格。现在我有时会给某些用户提供折扣。这个价格将有一个用户的 id 作为用户。

现在我想要一个为用户选择所有价格的查询。它应该采用用户为 0 或用户为用户 id 的所有价格,但如果存在 0 为用户且用户 id 为用户的行,则应仅采用用户 id 为用户的行。

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

最佳答案

您可以使用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
                                );

关于mysql - 优先考虑版本存在的某些行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40183047/

相关文章:

mysql - 如何查看mysql中索引的大小(包括主键)

mysql - 莫名其妙的 InnoDB 死锁

MySQL 无法创建外键约束

javascript - 如何将幻灯片范围插入mysql?

mysql - 聊天应用好友列表

mysql - 使用简单列和返回结果的聚合函数进行选择

mysql - 多次查询同一个表但在不同的列中mysql

mysql - 如何构造 SQL 查询以查找作为两个特定其他对象的父对象的对象?

MySQL - 更新列中的值与前一行相同的行

java - Hibernate - 删除期间表不存在