mysql - 用于从 OneToMany 关系中获取不同值的 MySQL 或 JPQL 查询(条件优先级)
问题描述
我有一个表产品,其中包含以下信息
ID | 产品名称 | 零售商名称 |
---|---|---|
1 | 衬衫 | 古驰 |
此表具有与product_prices的 OneToMany 连接,其中包含如下信息
ID | 价格 | 国家 | product_id |
---|---|---|---|
100 | 95.5 | 英国 | 1 |
101 | 97.5 | 法国 | 1 |
300 | 70.9 | 欧洲联盟 | 1 |
我需要创建一个 MySQL 或 JPQL 查询来检索
- 产品名称
- 零售商名称
- 价格(根据国家或选择欧盟)
例如:如果选择了英国国家 -> 那么它将检索:
- 衬衫 Gucci 95.5
如果选择国家意大利 -> 那么它将检索:
- 衬衫 Gucci 70.9
如您所见,在第二个示例中,系统检索了 EUROPEAN_UNION 价格,因为找不到意大利。
如果选择国家 EUROPEAN_UNION -> 那么它将检索:
- 衬衫 Gucci 70.9
如您所见,在第三个示例中,系统检索了 EUROPEAN_UNION 价格,因为找到了 EUROPEAN_UNION 国家/地区。
我怎样才能做到这一点?
我在 JPQL 中尝试过类似的东西:
select new com.ProductDTOWithPrice(p.id, p.product_name, p.retailer_name, " +
"pr.price) " +
"from Product p " +
"join ProductPrice pr " +
"where p.id =:productId and (case when pr.country=:country then 1 " +
"else when pr.country.id = EUROPEAN_UNION then 1 end)"
另外,尝试进行多项选择或使用存在,但仍然无法弄清楚。我被困在检索“价格”上。
select p.id, p.name,
Max(IF(pp.country_id = :countryId, true, false)) as mainCountry,
Max(IF(pp.country_id = 400, true, false)) as europeanCountry
from products p
join product_prices pp on p.id = pp.product_id
where p.id = '0002fb8977754949bf4da70535e1a2e6'
GROUP BY p.id;
请问有什么帮助吗?
解决方案
我已经使用 MYSQL 解决了这个问题:
select p.id, p.name, pp.price, country, (CASE
WHEN (pp.country_id = :country) THEN 3
WHEN (pp.country_id = EUROPEAN_UNION) THEN 2
else 0
end) as priorityIndex
from products p
join product_prices pp on p.id = pp.product_id
where p.id = '0002fb8977754949bf4da70535e1a2e6'
ORDER BY priorityIndex DESC
LIMIT 1;
如果有人知道更好的解决方案,请告诉我
推荐阅读
- asp.net-core-2.1 - 首先避免实体框架代码中的孤立记录
- python-3.x - 嵌套 Python 默认性能
- javascript - MacOs Chrome 将从 javascript 日期返回巴西利亚夏令时间
- r - 映射列表并使用另一个列表中的相同比例进行缩放
- python - 将交互式 matplotlib 图形保存到 html
- javascript - 使用范围滑块调整线性渐变
- java - 在 Java 中使用递归将字符串转换为反向字符串
- google-maps - 将自定义背景图像添加到谷歌地图中的可拖动多边形?
- windows-subsystem-for-linux - 使用wsl执行的bash命令的控制台输出在重定向到文件时被截断
- java - 如何在 Java 中漂亮地打印 3D 数组