我有一個與product_prices關聯的表products。對于不同的國家/地區,每種產品都可以有多個價格。
期望 的結果:當我運行查詢時,我想根據國家條件接收所有具有 1 個單一價格的產品。
邏輯
- 如果產品具有指定國家/地區的價格-> 則將顯示國家/地區價格。
- 如果產品沒有指定國家/地區的價格-> 則需要顯示 country_id 400 的價格。
- 如果產品沒有指定國家和 id 為 400 的國家的價格 -> 則需要顯示 country_id 為 500 的價格。
- 如果產品沒有指定國家和 id 400 和 id 500 -> 的價格,則將顯示具有用戶總數最多的國家的價格。
我為 1 個單一產品做了類似的事情。但我不知道如何為所有產品實作這些。
select p.id, pp.price, pp.country_id,
(CASE WHEN (pp.country_id=:countryId) then 0 else
(CASE WHEN (pp.country_id=400) then 1 else
(case when (pp.country_id=500) then 2 else 3 END) END) END) as priorityIndex
from products p
inner join product_prices pp on p.id = pp.product_id
inner join countries c on pp.country_id = c.id
where p.id = '00057c218b154d5b838b928a0189ff9f'
order by priorityIndex limit 1;
我的資料: 國家表
| country_id | 國家代碼 | 總用戶數 |
|---|---|---|
| 2 | FR | 10 |
| 10 | 我們 | 100 |
| 27 | 英國 | 200 |
| 400 | 歐洲聯盟 | 160 |
| 500 | 全球的 | 150 |
產品價格表
| product_id | price_id | 價格 | country_id |
|---|---|---|---|
| 產品1 | 1a | 19.99 | 27 |
| 產品1 | 1b | 20.99 | 400 |
| 產品1 | 1c | 30.99 | 500 |
| 產品2 | 2a | 199.99 | 10 |
| 產品2 | 2b | 299.99 | 400 |
| 產品3 | 3a | 50.99 | 500 |
| 產品4 | 4a | 40 | 2 |
| 產品4 | 4a | 45 | 10 |
插入國家 27 時我的預期輸出:
| product_id | 價格 | country_id |
|---|---|---|
| 產品1 | 19.99 | 27 |
| 產品2 | 20.99 | 400 |
| 產品3 | 50.99 | 500 |
| 產品4 | 45 | 10 |
我做了這樣的事情。但我不確定只有最后一部分。如果需要根據經銷商總數來選擇產品價格。
select A.id, A.price_id, A.price, A.country from
(select p.id, pp.id as price_id, pp.price, pp.country_id as country,
ROW_NUMBER() over (PARTITION BY p.id order by (CASE WHEN (pp.country_id=:countryId) then 0 else
(CASE WHEN (pp.country_id=400) then 1 else
(case when (pp.country_id=500) then 2 else 3 END) END) END), c.total_dealer_users desc) AS rowNumber
from products p
inner join product_prices pp on p.id = pp.product_id
inner join countries c on pp.country_id = c.id
where p.id in ('00057c218b154d5b838b928a0189ff9f','054a8caf911e4ff3a594990af20a9611')) as A
where rowNumber=1;
uj5u.com熱心網友回復:
使用 MySQL 8.0 ROW_NUMBER()允許洗掉除每個產品的第一行之外的所有行:
SELECT * FROM (
SELECT p.id,
pp.price,
pp.country_id,
ROW_NUMBER() OVER (PARTITION BY p.id ORDER BY FIELD(pp.country_id, 500, 400, 27) DESC) AS `rn`
FROM products AS p
JOIN product_prices AS pp
ON p.id = pp.product_id
WHERE p.id IN (...)
) AS t WHERE t.rn=1
uj5u.com熱心網友回復:
SELECT
*
FROM
(
SELECT
pp.product_id,
pp.price_id,
pp.price,
pp.country_id as country,
ROW_NUMBER() OVER (
PARTITION BY pp.product_id
ORDER BY FIELD(
c.country_id,
27,
400,
500,
c.country_id
),
c.total_users DESC
)
AS rowNumber
FROM
product_price pp
INNER JOIN
country c
ON pp.country_id = c.country_id
)
AS ranked_price
WHERE
rowNumber=1;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=94f8851be7f309d8c4fd1946230d7999
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/463084.html
標籤:mysql sql 条件语句 案子 mysql-8.0
