根据从父表中获得的两个案例加入两个表

时间:2013-05-10 07:54:57

标签: php mysql mysqli

我有一个硬币表,提供有关上传硬币的所有信息,并且有一个所有者表格,提供有关特定硬币所有者的信息。在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

2 个答案:

答案 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注入是安全的,否则不应该按照您的方式将请求参数插入到字符串中。最好使用预准备语句,这就是我在查询中替换?的原因。