mysql - 如何根据逻辑自查表并添加列?
问题描述
我有两个表tblplayer
和tblTransaction
架构:
表: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列playerName
、tblvirtualmoneytransactions.amount
和。tblvirtualmoneytransactions.destinationId
status
我已经设法获得前 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。
解决方案
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
推荐阅读
- python - 在 Celery 任务中所做的数据库更改在主线程中不可见
- java - 不要将 gradle 子项目安装为外部依赖项
- reactjs - 无法有条件地渲染组件
- java - if(true) 是做什么的?
- javascript - 使用本地或全局变量访问 json 文件的最佳方法是什么?
- ember.js - setApplication 中断了 ember-qunit 测试上下文
- java - 验证后更改对象字段的值
- jakarta-mail - 如何使用 Java 从电子邮件正文中提取数据
- kendo-ui - 带有图标的 Kendo TreeView 远程数据
- node.js - 是否可以在使用节点 js 的 Web 技术中使用 Badge Api 推送通知?