mysql - 在 MySql 中使用 IF 或 CASE 与 INNER JOIN
问题描述
我有 4 个不同的用户(投注者)表(糟糕的想法,但很久以前需要进行大规模的重新设计),我需要列出来自特定事件的用户。
我看过这篇文章,但不喜欢 MySQL 查询,其中 JOIN 取决于 CASE
我也看过类似的问题,但没有找到任何我可以使用的东西。
这是我的查询:
SELECT
sale_id, sale_punter_type, sale_refund, sale_timestamp,
sale_punter_type,
AES_DECRYPT(punter_email, :keyPunter) AS punter_email,
punter_firstname,
punter_surname,
AES_DECRYPT(punter_postcode, :keyPunter) AS punter_postcode,
AES_DECRYPT(punter_checkout_email, :keyPunter) AS punter_checkout_email,
punter_checkout_firstname,
punter_checkout_surname,
AES_DECRYPT(punter_checkout_postcode, :keyPunter) AS punter_checkout_postcode,
AES_DECRYPT(punter_compo_email, :keyPunter) AS punter_compo_email,
punter_compo_firstname,
punter_compo_surname,
AES_DECRYPT(punter_shop_email, :keyPunter) AS punter_shop_email,
punter_shop_firstname,
punter_shop_surname
FROM
sale
INNER JOIN
ticket_sold ON sale_id = ticket_sold_sale_no
INNER JOIN
event ON event_id = ticket_sold_event_no
INNER JOIN
(CASE
WHEN
sale_punter_type = 1 THEN punter ON punter_id = sale_punter_no
WHEN
sale_punter_type = 2 THEN punter_checkout ON punter_checkout_id = sale_punter_no
WHEN
sale_punter_type = 3 THEN punter_compo ON punter_compo_id = sale_punter_no
WHEN
sale_punter_type = 4 THEN punter_shop ON punter_shop_id = sale_punter_no
END)
WHERE
event_id = :id
我尝试使用左连接:
SELECT
sale_id, sale_punter_type, sale_refund, sale_timestamp,
sale_punter_type,
AES_DECRYPT(punter_email, :keyPunter) AS punter_email,
punter_firstname,
punter_surname,
AES_DECRYPT(punter_postcode, :keyPunter) AS punter_postcode,
AES_DECRYPT(punter_checkout_email, :keyPunter) AS punter_checkout_email,
punter_checkout_firstname,
punter_checkout_surname,
AES_DECRYPT(punter_checkout_postcode, :keyPunter) AS punter_checkout_postcode,
AES_DECRYPT(punter_compo_email, :keyPunter) AS punter_compo_email,
punter_compo_firstname,
punter_compo_surname,
AES_DECRYPT(punter_shop_email, :keyPunter) AS punter_shop_email,
punter_shop_firstname,
punter_shop_surname
FROM
sale
INNER JOIN
ticket_sold ON sale_id = ticket_sold_sale_no
INNER JOIN
event ON event_id = ticket_sold_event_no
INNER JOIN
punter ON punter_id = sale_punter_no
LEFT JOIN
punter_checkout ON punter_checkout_id = sale_punter_no
LEFT JOIN
punter_compo ON punter_compo_id = sale_punter_no
LEFT JOIN
punter_shop ON punter_shop_id = sale_punter_no
WHERE
event_id = :id
但它返回了具有相同 ID 但来自不同表的用户。
我不知道如何解释它,我需要类似的东西
IF sale_punter_no = 1 THEN INNER JOIN punter ON punter_id = sale_punter_no
希望这是有道理的,mysql可以做这样的事情
谢谢
解决方案
您可以LEFT JOIN
在每个表上执行,如下所示。
但是,从您的示例中,您不清楚要从每个相关表中使用哪些列;您需要使用COALESCE()
或类似的方法来相应地合并它们。在每一列前面加上它所属的表(或表别名)总是一个很好的做法。
这是查询:
SELECT
sale_id, sale_punter_type, sale_refund, sale_timestamp,
sale_punter_type,
AES_DECRYPT(punter_email, :keyPunter) AS punter_email,
punter_firstname,
punter_surname,
AES_DECRYPT(punter_postcode, :keyPunter) AS punter_postcode,
AES_DECRYPT(punter_checkout_email, :keyPunter) AS punter_checkout_email,
punter_checkout_firstname,
punter_checkout_surname,
AES_DECRYPT(punter_checkout_postcode, :keyPunter) AS punter_checkout_postcode,
AES_DECRYPT(punter_compo_email, :keyPunter) AS punter_compo_email,
punter_compo_firstname,
punter_compo_surname,
AES_DECRYPT(punter_shop_email, :keyPunter) AS punter_shop_email,
punter_shop_firstname,
punter_shop_surname
FROM sale
JOIN ticket_sold ON sale_id = ticket_sold_sale_no
JOIN event ON event_id = ticket_sold_event_no
LEFT JOIN punter ON punter_id = sale_punter_no AND sale_punter_type = 1
LEFT JOIN punter_checkout ON punter_checkout_id = sale_punter_no AND sale_punter_type = 2
LEFT JOIN punter_compo ON punter_compo_id = sale_punter_no AND sale_punter_type = 3
LEFT JOIN punter_shop ON punter_shop_id = sale_punter_no AND sale_punter_type = 4
WHERE event_id = :id
推荐阅读
- java - Liquibase 通过 Springboot 执行 postgres 方法
- sql - 在bigquery中根据id和时间对数据进行分组
- swift - Xcode 10.1 无法归档项目
- postgresql - 将整个 select 语句作为参数传递 - PostgreSQL 函数
- regex - 如何在linux中删除特定的“] [”
- c# - C#需要帮助实时修改datagridview
- maven - 在我的项目中添加了axis2作为maven依赖项
- java - 在 Eclipse 中输入 stream() 或 map() 而不使用箭头键
- python - 在 python ImportError 上导入 librosa 的问题:无法导入名称“iter_entry_points”
- flutter - chart_flutter 包中的图中的 domainFn 和 measureFn 是什么?