首页 > 解决方案 > 如何根据逻辑自查表并添加列?

问题描述

我有两个表tblplayertblTransaction架构:

表:tblplayer

playerId   firstName    lastName
   3         John        Clark
   5          Mc        Donalds
   7         Stef         Joe

表:tblvirtualmoneytransactions

source    sourceId    destination    destinationId    amount
   3        31            4             5              0.000
   4         3            6             7              20.000
   4         3            6             5              21.000

我需要准备 4列playerNametblvirtualmoneytransactions.amount和。tblvirtualmoneytransactions.destinationIdstatus

我已经设法获得前 3 列playerName, tblvirtualmoneytransactions.amount,tblvirtualmoneytransactions.destinationId查询和条件:

SELECT 
(SELECT concat(tblplayer.firstName, ' ', tblplayer.lastName) FROM tblplayer WHERE tblplayer.playerId=tvm.destinationId) as playerName, 
tvm.amount as amount,
tvm.destinationId as destinationId
FROM tblvirtualmoneytransactions tvm WHERE tvm.source=4 AND tvm.destination=6 AND tvm.sourceId=3;

结果:

playerName   amount    destinationId
Mc Donalds    21           5
Stef Joe      20           7

status从上面的结果,我需要从同一个查询中获取列,条件是:

status would be 1, IF the tvm2.source=3 AND tvm2.destination=4 AND tvm2.destinationId=tvm.destinationId.

但我无法获得第四列的价值。

如果需要,我也准备好了一个SQLfiddle

标签: mysql

解决方案


JOIN当 a可以工作时,不要使用相关子查询。

您可以使用 self-LEFT JOIN 来匹配具有其他条件的行。然后,您可以使用测试来测试这是否找到匹配项NULL

SELECT CONCAT(p.firstName, ' ', p.lastName) AS playerName,
    tvm.amount, tvm.destinationId,
    tvm2.destinationId IS NOT NULL AS status
FROM tblvirtualmoneytransactions AS tvm
JOIN tblplayer AS p ON p.playerId=tvm.destinationId
LEFT JOIN tblvirtualmoneytransactions AS tvm2 
    ON tvm.destinationId = tvm2.destinationId AND tvm2.source=3 AND tvm2.destination=4
WHERE tvm.source=4 AND tvm.destination=6 AND tvm.sourceId=3

演示


推荐阅读