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版本、设置和表引擎)