首页 > 解决方案 > 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 |
+-----------+-------+

标签: mysql

解决方案


您可以使用下一个查询来解决您的问题:

-- 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的例子


推荐阅读