mysql - MySQL OR 优先
问题描述
有一个客户表和一个价格表。每个客户都可以有一个协商的价格。为客户加载价目表的最有效方法是什么?
+-----------+--------------+
| accountid | account_name |
+-----------+--------------+
| 1 | test |
+-----------+--------------+
+---------+-----------+-----------+-------+
| priceid | accountid | productid | price |
+---------+-----------+-----------+-------+
| 1 | 1 | 10 | 9.99 |
| 1 | | 10 | 11.99 |
| 2 | | 12 | 5.99 |
+---------+-----------+-----------+-------+
结果应该是:
+-----------+-------+
| productid | price |
+-----------+-------+
| 10 | 9.99 |
| 12 | 5.99 |
+-----------+-------+
解决方案
您可以使用下一个查询来解决您的问题:
-- Select price list for account no. 1
SELECT productid, price
FROM price_table
WHERE accountid = 1
UNION -- append by rest pricelist
SELECT productid, price
FROM price_table
WHERE
accountid = '' AND -- for prices without accountid
NOT EXISTS ( -- and nave not price specified for account id
SELECT productid
FROM price_table pt
WHERE pt.accountid = 1 AND pt.productid = price_table.productid
);
price_table 中的 PS 更喜欢将 accountid 字段设置为可为空的 int 而不是 varchar。看看db<>fiddle的例子
推荐阅读
- angular - 有没有办法一次分派一个动作?
- javascript - 如何在我的 Nodejs 快速后端读取 Xmlhttprequest POST 请求中发送的值?
- ccc - T 103 - 负标记
- javascript - 使所有项目的 laravel mix 代理地址相同
- matplotlib - 如何做一个嵌套的比例面积图(圆圈)?
- reactjs - react-project 中使用的@material-table 出错
- android - 在productflavor中拆分apk
- flutter - 带文本字段的卡片
- elasticsearch - 从远程服务器拉日志到elasticsearch
- javascript - 将beeswarm与scalePoint结合