我正在尝试编写一个MySQL查询,它从两个不同的连接表中获取数据。我不久前偶然发现了一个类似的情况,有些Stackoverflower帮我解决了问题,但是现在,试着从他的解决方案开始,我无法弄清楚如何修改我当前问题的查询。 / p>
考虑一下我有这两个表:
Transactions
-------------------------------------
| TransactionId | Currency | Amount |
-------------------------------------
| 1 | EUR | 15.00 |
| 2 | EUR | 39.50 |
| 3 | USD | 10.00 |
-------------------------------------
和
Transaction_Paths
---------------------------------------------------------------------------------
| TPathId | TPathType | TPathDirection | TPathLink | transactions_TransactionId |
---------------------------------------------------------------------------------
| 1 | 'bank' | 'to' | 1 | 1 |
| 2 | 'bank' | 'from' | 2 | 1 |
| 3 | 'account' | 'from' | 1 | 1 |
| 4 | 'account' | 'to' | 2 | 1 |
| 5 | 'bank' | 'to' | 3 | 2 |
| 6 | 'bank' | 'from' | 2 | 2 |
| 7 | 'bank' | 'to' | 4 | 3 |
| 8 | 'account' | 'from' | 1 | 3 |
---------------------------------------------------------------------------------
基本上,这两个表存储在我的站点上发生的事务,以及Transaction_Paths
表中有关这些事务的信息。 Transactions
表格中的每一行都可以通过Transaction_Paths
字段在Transaction_paths.transactions_TransactionId
表格中包含多个附加行。
我怎么能写一个查询,查询来自'的确切交易。 ID为1的帐户,以及ID为4的银行to
基于the previous question that I asked,以及它的答案,我应该使用HAVING,但是当我有多个条件应该匹配在第二个表时,我怎么能使用?
编辑:预期结果应该只返回Transactions
表格中的第三行,就像在行中一样,TransactionId
为3。
答案 0 :(得分:2)
要实现所需的输出,您需要进行三级连接的事务处理Transaction_Paths左连接Transaction_Paths左连接事务。第一个左连接(自连接Transaction_Paths左连接Transaction_Paths)将没有条件,但第二个左连接将打开(Transaction_Paths.transactions_TransactionId = Transaction_Paths.TransactionId)。
我为此做了一个伪查询,给你一个如下想法:
SELECT c.*
FROM Transaction_Paths a
LEFT JOIN Transaction_Paths b
LEFT JOIN Transactions c ON (a.transactions_TransactionId = c.TransactionId)
WHERE a.TPathDirection = "from" AND a.TPathLink = 1 AND b.TPathDirection = "to" AND b.TPathLink = 4
希望您可以使用自己喜欢的查询控制台提出相应的查询。或者用小提琴分享您的架构(例如SQL fiddle),我会尝试构建确切的查询并编辑此帖子。
答案 1 :(得分:0)
与此同时,我完全忘记了M H Rasel的答案,并找到了另一种方法。对于回答者所付出的努力,我会将他的答案标记为已接受的答案,同时,如果这确实适用于所有情况,有人可以评论我的答案吗?我的测试,尽管有限,提供了正确的结果:
SELECT Transactions.*
FROM Transactions
INNER JOIN Transaction_Paths
ON Transaction_Paths.transactions_TransactionId = Transactions.TransactionId
WHERE Transaction.Currency = 'USD' AND
((TransactionPaths.TPathDirection = 'from' AND TransactionPaths.TPathLink = '1')
OR (TransactionPaths.TPathDiretion= 'to' AND TransactionPaths.TPathLink = '4'))
GROUP BY Transactions.TransactionId
HAVING COUNT(distinct Transaction_Paths.TPathId) = 2