PHP / Laravel应用程序-查询通过第三个表关联的两个数据库表?内部加入

时间:2018-10-18 13:04:09

标签: sql sql-server inner-join

我正在使用Laravel / Angular应用程序,并且在其中一个页面上有一个表单,其中显示一个表格,其中包含有关多个帐户的信息。该表中的一列标题为“联系人”,并且该列中的每个单元格都显示该表项的默认联系人的名称。

此列中的单元格还显示一个“编辑”按钮,单击该按钮将打开一个对话框,以允许用户向该表条目添加另一个联系人-对话框显示带有“名字”字段的表格'&'电子邮件',并带有“添加联系人”按钮。

对于要发送给该用户的信函中的名称应如何显示,也有一个简短的“预览”,即“ Hi forename surname”或“ Hi forename”,具体取决于联系人的类型以及正在使用信函模板。

在显示相关名称时遇到了一些麻烦,因为我不确定如何编写需要检索相关名称的SQL查询。

表的设置应使account.account表包含以下值:

“帐户ID”,“帐户名称”,帐户类型ID”,

account.property表包含

的值

“属性ID”,属性标签”,“属性标签”,“属性说明”。

account.property表中,有两行包含用于不同通信方式的名称-一行带有'property tag'addresseename,另一行带有'property tag 'addresseenamepdf。我想在对话框的“预览”中显示这些值,但是我不确定如何编写SQL来检索它们。

据我所知,表之间没有主键/外键关系,但有人告诉我它们是使用View account.vAccount链接的。自从我用SQL完成非常基本的数据库编程以来,已经有好几年了,而且我之前从没见过视图,所以不确定如何在查询中使用它们...

在MS SQL SMS中,如果我右键单击`account.vAccount视图,并选择前1000行,则会看到查询:

SELECT TOP (1000) [accountId]
  ,[name]
  ,[typeId]
  ,[accountType]
  ,[accountTypeTag]
  ,[typeParentId]
  ,[parentAccountType]
  ,[parentAccountTypeName]
  ,[balanceDate]
  , // several other values here
FROM [myDB].[account].[vAccount]

运行,并显示结果列表,我可以通过在查询末尾添加where子句来进行过滤:

FROM [myDB].[account].[vAccount] where accountId = 53092;

,这只会返回该特定帐户的view行。但是,我看不到要从addresseename表中检索其数据的addresseenamepdfaccount.property列。

我对SQL的(有限的)理解告诉我,我将需要在这两个表之间创建一个关系,以便能够查询我只想使用的addressenameaddresseenamepdfaccountId值(即具有另一个表中的一个表的外键)。

我的理解是否正确,还是可以使用view来检索此数据而无需在表之间建立关系?如果可以的话,我该怎么做?

-编辑-

所以看来我想念这两个表实际上是通过第三个表关联的(我才刚刚开始在此应用程序上工作)-这些表是:

帐户

  • 帐户ID(PK)
  • 名称
  • typeId
  • ...

属性值

  • propertyValueId(PK)
  • accountId
  • propertyId
  • ...

属性

  • propertyId(PK)
  • propertyLabel
  • propertyTag
  • ...

表具有以下关系:

帐户一对多 propertyValue 多对一 property

我如何编写一个查询,该查询将返回两个特定属性(对于propertyId值为{的帐户,其48值为49accountId的属性{1}}?

我尝试运行查询:

53092

但是当我尝试执行时,出现错误消息:

  

关键字“ INNER”附近的语法不正确。

我为什么要得到这个?我在做什么错了?

1 个答案:

答案 0 :(得分:1)

查询的结构应为

Select 
From
join on
where
group by
Having.

where子句之前,您有join子句。

更改为:

SELECT TOP (1000) [accountID]
    ,[name
    ...
FROM [myDB][account].[account] 
INNER JOIN [myDB].[account].[propertyValue] ON … (you are missing the on clause)
where accountID = 53092 and (
propertyTag = 'ADDRESSEENAME' | propertyTag = 'ADDRESSEENAMEPDF');