Php 如何使用MYSQL案例中的右连接获取两列的数据

Php 如何使用MYSQL案例中的右连接获取两列的数据,php,mysql,database,join,Php,Mysql,Database,Join,我想获取类别定价,比如说,如果customer\u category\u定价表中有数据,那么就获取该特定客户的定价。否则,从categories表中获取默认价格 我已经尝试使用mysql来实现这个期望的结果,但是问题是,它返回了两行 每小时\金额\最终列返回更新后的价格,然后每\天\金额\最终返回默认价格 然后在下一行中,每小时金额最后一列返回默认价格,然后每一天金额最后一列返回更新后的价格 表:公共关系单位类别 -----------------------------------------

我想获取类别定价,比如说,如果customer\u category\u定价表中有数据,那么就获取该特定客户的定价。否则,从categories表中获取默认价格

我已经尝试使用mysql来实现这个期望的结果,但是问题是,它返回了两行

每小时\金额\最终列返回更新后的价格,然后每\天\金额\最终返回默认价格

然后在下一行中,每小时金额最后一列返回默认价格,然后每一天金额最后一列返回更新后的价格

表:公共关系单位类别

---------------------------------------------------------------------------------
| id | title            | hourly_amount | per_day_amount | created_at| updated_at
---------------------------------------------------------------------------------
| 1  | Power Generation | 100.00        | 200.00         | 
| 2  | Local Government | 300.00        | 400.00         |
----------------------------------------------------------
表:公关、客户、类别、定价

------------------------------------------------------------------------------------
| id | customer_id | category_id | billing_type_id | amount | created_at | updated_at
------------------------------------------------------------------------------------
| 1  |      1      |      1      |         1       |   109  |
| 2  |      1      |      1      |         2       |   600  |
----------------------------------------------------------
表:公共关系账单类型

----------------
| id | title   |
--------------
| 1  | Hourly  |
| 2  | Per Day |
----------------
这就是我目前正在处理的问题:

SELECT c.id,c.title,
CASE
    WHEN (c.hourly_amount <> (SELECT ccp.amount WHERE ccp.billing_type_id = 1)) 
    THEN (SELECT ccp.amount WHERE ccp.billing_type_id = 1)
    ELSE c.hourly_amount
END
AS hourly_amount_final,

CASE
    WHEN (c.per_day_amount <> (SELECT ccp.amount WHERE ccp.billing_type_id = 2)) 
    THEN  (SELECT ccp.amount WHERE ccp.billing_type_id = 2)
    ELSE c.per_day_amount
END
AS per_day_amount_final

FROM pr_customer_category_pricing AS ccp
RIGHT JOIN pr_categories AS c
ON c.id = ccp.category_id AND ccp.customer_id = 1
pr\u客户\u类别\u定价中有数据时的预期结果

我得到的实际结果:

----------------------------------------------------------------------
| id | title            | hourly_amount_final | per_day_amount_final |
----------------------------------------------------------------------
| 1  | Power Generation |      109.00         |      200.00          | 
| 1  | Power Generation |      100.00         |      600.00          |
| 2  | Local Government |      300.00         |      400.00          |
----------------------------------------------------------------------
我做错了什么?任何建议!帮助兄弟摆脱困境S

您可以将最大聚合与分组依据一起使用

SELECT c.id,c.title,
max(CASE
    WHEN (c.hourly_amount <> (SELECT ccp.amount WHERE ccp.billing_type_id = 1)) 
    THEN (SELECT ccp.amount WHERE ccp.billing_type_id = 1)
    ELSE c.hourly_amount
END)
AS hourly_amount_final,

max(CASE
    WHEN (c.per_day_amount <> (SELECT ccp.amount WHERE ccp.billing_type_id = 2)) 
    THEN  (SELECT ccp.amount WHERE ccp.billing_type_id = 2)
    ELSE c.per_day_amount
END)
AS per_day_amount_final

FROM pr_customer_category_pricing AS ccp
RIGHT JOIN pr_categories AS c
ON c.id = ccp.category_id AND ccp.customer_id = 1
group by c.id,c.title

由于每个计费类型的pr_customer_category_定价表中只能有一个条目,因此您可以通过从pr_customer_category_定价创建一个派生的透视表,并在单独的列中为每个计费_type_id创建值来简化操作。然后,您可以简单地将派生表中的值与每个计费类型id的pr_类别中的值合并:

输出:

id  title               hourly_amount_final per_day_amount_final
1   Power Generation    109                 600
2   Local Government    300                 400

当pr_customer_category_定价中的金额大于pr_category定价中的默认金额时,它的效果非常好,但是,假设更新后的价格低于该类别的默认价格,max在这种情况下不起作用。对不起,我刚才没提到@FA06对于每种计费类型,在pr_客户_类别_定价中是否会有多个记录?是的,如果该客户的价格得到更新,则最多会有2个记录,因为目前只有2种计费类型@NickOK,但每种账单类型只有一条记录?绝对是一条。嗯@NickWORKS就像一个符咒!太谢谢你了,伙计直到现在我才知道联合会做什么。再次感谢你!批准它作为答案@Nick@Mohsin是的,当您从要替换的左或右连接中获得空值时,合并非常有用。不管怎样,很高兴我能帮上忙。这真的提高了我的知识,而且简化了事情,而且对那把小提琴来说也是+1。万分感谢@刻痕
SELECT c.id,c.title,
max(CASE
    WHEN (c.hourly_amount <> (SELECT ccp.amount WHERE ccp.billing_type_id = 1)) 
    THEN (SELECT ccp.amount WHERE ccp.billing_type_id = 1)
    ELSE c.hourly_amount
END)
AS hourly_amount_final,

max(CASE
    WHEN (c.per_day_amount <> (SELECT ccp.amount WHERE ccp.billing_type_id = 2)) 
    THEN  (SELECT ccp.amount WHERE ccp.billing_type_id = 2)
    ELSE c.per_day_amount
END)
AS per_day_amount_final

FROM pr_customer_category_pricing AS ccp
RIGHT JOIN pr_categories AS c
ON c.id = ccp.category_id AND ccp.customer_id = 1
group by c.id,c.title
SELECT c.id,c.title,
       COALESCE(ccp.hourly_amount, c.hourly_amount) AS hourly_amount_final,
       COALESCE(ccp.per_day_amount, c.per_day_amount) AS per_day_amount_final
FROM (SELECT
          customer_id,
          category_id,
          MAX(CASE WHEN billing_type_id = 1 THEN amount END) AS hourly_amount,
          MAX(CASE WHEN billing_type_id = 2 THEN amount END) AS per_day_amount
     FROM pr_customer_category_pricing
     GROUP BY customer_id, category_id) AS ccp
RIGHT JOIN pr_categories AS c
ON c.id = ccp.category_id AND ccp.customer_id = 1
id  title               hourly_amount_final per_day_amount_final
1   Power Generation    109                 600
2   Local Government    300                 400