-1
假设我们有一个表resource
,item
和price
获取数据:在的groupId = 4台资源默认行
item
+--------+---------+
| itemId | name |
+--------+---------+
| 2743 | Product |
+--------+---------+
resource
+------------------+-----+----------------+--+
|resourceId | key | value | groupId |
+-----------+-----+----------------+---------+
| 45 | 1 | Client | 3 |
| 46 | 2 | Manufacturer | 3 |
| 69 | 1 | Delivery | 4 |
| 70 | 2 | Collection | 4 |
| 71 | 3 | Assembly | 4 |
| 72 | 4 | Client Request | 4 |
| 73 | 1 | Draft | 5 |
| 74 | 2 | Not Confirmed | 5 |
| 75 | 3 | Confirmed | 5 |
+-----------+-----+----------------+---------+
price
+---------+-----------+--------+----------+
| priceId | serviceId | itemId | price |
+---------+-----------+--------+----------+
| 294 | 4 | 0 | 20.0000 |
| 293 | 3 | 0 | 20.0000 |
| 292 | 2 | 0 | 20.0000 |
| 291 | 1 | 0 | 20.0000 |
| 290 | 1 | 2743 | 18.4000 |
| 288 | 1 | 2738 | 10.0000 |
| 267 | 4 | 2721 | 0.0000 |
| 266 | 3 | 2721 | 0.0000 |
| 265 | 2 | 2721 | 0.0000 |
+---------+-----------+--------+----------+
行的服务。它们通过表price
(serviceId
)的列key
提及。正如你所看到的,我有这些服务的默认价格(price
中的前四行,itemId
= 0)。我需要获取尽可能多的pirce
行,因为有给定项目的服务。如果该项目没有服务价格,则应该提取服务的默认价格。例如,id = 2743的商品具有服务交货的价格。对于所有其他服务,应该返回其默认价格。我需要的是这样的结果:
+---------+-----------+--------+----------+-----------+-----+----------------+---------+
| priceId | serviceId | itemId | price |resourceId | key | value | groupId |
+---------+-----------+--------+----------+-----------+-----+----------------+---------+
| 290 | 1 | 2743 | 18.4000 | 69 | 1 | Delivery | 4 |
| 292 | 2 | NULL | 17.0000 | 70 | 2 | Collection | 4 |
| 293 | 3 | NULL | 13.0000 | 71 | 3 | Assembly | 4 |
| 294 | 4 | NULL | 9.0000 | 72 | 4 | Client Request | 4 |
+---------+-----------+--------+----------+-----------+-----+----------------+---------+
这是我试过的查询。我得到尽可能多的行,服务,但个个都具有相同的价格(该项目的)
SELECT *
FROM `price` AS `p`
INNER JOIN `item` ON p.id = item.id
RIGHT JOIN `resource` AS `res` ON 1 = 1
WHERE (res.groupId = 4)
AND (p.itemId = 2743);
请告诉我们你已经尝试过的查询 - 我希望你自己尝试过了。 – Seb
请参阅LEFT JOIN和COALESCE() - 尽管提供不完整的数据集是很荒谬的。 – Strawberry
我担心我对你的模式感到困惑。请[编辑]你的问题。它看起来像'resource.key'值可用于连接到'price.serviceId'。那是对的吗?我认为你的规范说的是'price.itemId'的值为零,因为特殊的处理,因为它们显示'resource'表中'resource.groupId' = 4的行的后备价格。那是对的吗? 'RIGHT JOIN'有点奇怪,'RIGHT JOIN ... ON 1 = 1'真的很怪异。 –