我有一个硬币表,提供有关上传硬币的所有信息,并且有一个所有者表格,提供有关特定硬币所有者的信息。在coin_owners表中,有字段'ownership_mode',它将是“传输”或“奖励”。如果模式为“转移”,我想离开加入转移表,如果模式为“奖励”,我想加入奖励表。
我使用 CASE 子句尝试过此操作,但它无效。
我试过的查询是:
SELECT * , coins.id AS CoinId FROM coins
LEFT JOIN coin_owners ON coin_owners.coin_id = coins.id
LEFT JOIN (CASE WHEN coin_owners.`ownership_mode` = 'transfer' THEN transfer_detail ON transfer_detail.transfer_to = coin_owners.current_owner
AND transfer_detail.transfer_from = SUBSTRING_INDEX( coin_owners.previous_owner, ',', '-1' )
WHEN coin_owners.`ownership_mode` = 'Reward' THEN rewards ON rewards.`coin_ids` = coin_owners.coin_id
AND coin_owners.`ownership_mode` = 'Reward'
AND STATUS = '0'
) WHERE coins.id ='".validString($_REQUEST["coinId"])."' LIMIT 0,1
答案 0 :(得分:4)
非常感谢...但我使用了以下查询,并且工作正常> ---->
SELECT * , coins.id AS CoinId FROM coins
LEFT JOIN coin_owners ON coin_owners.coin_id = coins.id
LEFT JOIN transfer_detail ON transfer_detail.coin_id = coin_owners.coin_id AND transfer_detail.transfer_to = coin_owners.current_owner AND transfer_detail.transfer_from = SUBSTRING_INDEX( coin_owners.previous_owner, ',', '-1' ) AND coin_owners.`ownership_mode` = 'transfer'
LEFT JOIN rewards ON rewards.`coin_ids` = coin_owners.coin_id AND coin_owners.`ownership_mode` = 'Reward' AND STATUS = '0'
WHERE coins.id ='".mysql_real_escape_string(trim($_REQUEST["coinId"]))."' LIMIT 0,1
感谢所有人的帮助
答案 1 :(得分:1)
CASE
是一个表达式,你不能在表引用中使用它。您必须使用单独的查询来处理这两种情况,然后您可以使用UNION
:
(
SELECT …
FROM coins
LEFT JOIN coin_owners ON coin_owners.coin_id = coins.id
LEFT JOIN transfer_detail
ON transfer_detail.transfer_to = coin_owners.current_owner
AND transfer_detail.transfer_from =
SUBSTRING_INDEX(coin_owners.previous_owner, ',', '-1')
WHERE coin_owners.ownership_mode = 'transfer'
AND coins.id = ?
UNION ALL
SELECT …
FROM coins
LEFT JOIN coin_owners ON coin_owners.coin_id = coins.id
LEFT JOIN rewards
ON rewards.coin_ids = coin_owners.coin_id
AND STATUS = '0'
WHERE coin_owners.ownership_mode = 'Reward'
AND coins.id = ?
)
LIMIT 0,1
您必须确保两个查询的列匹配,可能是将NULL
值插入到其中一个查询中没有相应值的值中。
另请注意,除非您绝对确定传递的值对SQL注入是安全的,否则不应该按照您的方式将请求参数插入到字符串中。最好使用预准备语句,这就是我在查询中替换?
的原因。