2017-01-17 37 views
-1

假设我们有一个表resourceitemprice获取数据:在的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 | 
+---------+-----------+--------+----------+ 

行的服务。它们通过表priceserviceId)的列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); 
+1

请告诉我们你已经尝试过的查询 - 我希望你自己尝试过了。 – Seb

+1

请参阅LEFT JOIN和COALESCE() - 尽管提供不完整的数据集是很荒谬的。 – Strawberry

+0

我担心我对你的模式感到困惑。请[编辑]你的问题。它看起来像'resource.key'值可用于连接到'price.serviceId'。那是对的吗?我认为你的规范说的是'price.itemId'的值为零,因为特殊的处理,因为它们显示'resource'表中'resource.groupId' = 4的行的后备价格。那是对的吗? 'RIGHT JOIN'有点奇怪,'RIGHT JOIN ... ON 1 = 1'真的很怪异。 –

回答

0
select i.itemId, coalesce(p1.price, p0.price) 
from item i 
cross join price p0 
left join price p1 
    on p1.serviceId = p0.serviceId 
    and p1.itemId = i.itemId 
where i.itemId = 2743 
    and p0.itemId = 0