Php 从3个sql表收集数据以创建单个结果

Php 从3个sql表收集数据以创建单个结果,php,mysql,Php,Mysql,想知道是否有人可以帮助解决以下问题 我有三张桌子 表1,商店: sID | sName cID | cFName | cLName tID | cID | tInvoiceNo | sID | tPaymentType | tTotal 表2,客户: sID | sName cID | cFName | cLName tID | cID | tInvoiceNo | sID | tPaymentType | tTotal 表3,交易记录: sID | sName cID | cF

想知道是否有人可以帮助解决以下问题

我有三张桌子


表1,商店:

sID | sName
cID | cFName | cLName
tID | cID | tInvoiceNo | sID | tPaymentType | tTotal
表2,客户:

sID | sName
cID | cFName | cLName
tID | cID | tInvoiceNo | sID | tPaymentType | tTotal
表3,交易记录:

sID | sName
cID | cFName | cLName
tID | cID | tInvoiceNo | sID | tPaymentType | tTotal

表3中的一个示例事务是

1 | 001 | 1023 | S01 | CASH       | 20

2 | 001 |  -   | 002 | FRIENDGIFT | 10
第一行是客户001(即bob)和商店S01(即toysRus)之间的实际交易,bob以现金支付(20美元)

第二排是001(鲍勃)送给002(吉姆)一份10美元的礼物

问题

这很好,但我想得到的是一个SQL语句,它不仅打印出像001、002和S01这样的ID,而且还打印出相应的名称。。。作为一个ID,对用户来说没有任何意义

例如,对过去5次转换的sql查询应该会给出如下输出

1 | 001 | bob | smith | 1023 | S01 | Toys R us | CASH | 20

2 | 001 | bob | smith |  -   | 002 | jane | black | FRIENDGIFT | 10
条件

除了支付类型的FRIENDGIFT之外的所有内容都将始终是表1(商店)中的ID。。。SQL中是否有IF语句?也许是某种形式的加入

或者,它不可能在一个查询中完成,并且需要拆分为2个。。。一个用于获取过去的事务,另一个用于获取每个ID的名称,具体取决于tPaymentType(我使用php通过mysql获取结果,所以两个查询不会成为问题,只是我希望处理尽可能少的查询)

我希望我没有把任何人弄糊涂

提前谢谢


解决方案

非常感谢mario,下面是生成的sql查询

SELECT *
  FROM Transactions
  LEFT JOIN Customer USING (cID)
  LEFT JOIN Shop USING (sID)
  LEFT JOIN Customer c ON c.cID = sID
ORDER BY tID DESC
LIMIT 5

确实有一种简单的方法可以让查询从多个表中积累数据

SELECT *
  FROM Transactions
  LEFT JOIN Customer USING (cID)
  LEFT JOIN Shop USING (sID)
ORDER BY tID DESC
LIMIT 5
如果要联接的表中的列名相同,则可以使用更简单的
USING
条件。但是也有
ON
子句,它允许其他条件(但是需要表别名)。

这几乎完美地工作了,谢谢!我唯一的问题是,FRIENDGIFT事务不显示两个客户详细信息,只显示第一个ID的客户详细信息,即cID而不是sID。是否可以这样说,如果(tPaymentType=='FRIENDGIFT')使用(sID)离开加入商店,或者使用(sID)离开加入客户?哦,现在我明白了。在您的案例中,shopID有时实际上是对customerID的引用。我相信这可以通过一个无关的ON条款来实现,但这将是一个黑客行为。尝试在c.cID=sID上添加最后一个
左加入客户c
(不确定是否可以在ON子句中添加
,tPaymentType='FRIENDGIFT'
。在您的情况下,这不是必需的。)可能必须在c.cID=Transactions.sID上编写
左加入客户c
-较短的版本对我不起作用(可能取决于mysql版本、设置和表引擎)