当第二个表具有应匹配的多个条件时,从多个表中查询

时间:2017-11-22 15:08:57

标签: mysql

我正在尝试编写一个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。

2 个答案:

答案 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