0

我有两个表 tblSettingsLookup 和 tblFirm。我在查找表中有 5 个设置,基本上用于动态渲染设置名称。例如,如果有 5 个设置,那么每个公司可以在某个页面上看到 5 个设置。如果我添加一个新设置,现在所有公司都会看到 6 个设置。

我有一个从 tblSettingsLookup 获取所有设置的页面,用户可以通过复选框从我的应用程序的网页中选择这些设置并将其保存到数据库中。这些用户设置保存在另一个表 tblusersettingsforfirms

tblusersettingsforfirm 有 settingIDFK、firmIDFK 和其他一些列 tblSettingsLookup 有 settingID,设置名称 tblFirm 有 FirmID

我真正需要做的是我想要一个查询,它返回来自 tblSettingsLookup 的所有记录以及基于公司 ID 的公司的所有用户设置。

我试过左外连接但没有希望。我不需要交叉连接

结果应该如下所示:

firmid settingname      
1      add user
1      delete user
1      save user
2      add user
2      save user
2      delete user 
4

3 回答 3

1

你想要的是一个交叉连接和一个左连接:

select f.FirmID, l.settingname, u.settingIDFK
from
  tblFirm as f
  cross join tblSettingsLookup as l
  left join tblusersettingsforfirms u
    on u.settingIDFK = l.settingID and u.firmIDFK = f.FirmID

u.settingIDFK如果没有用户设置,则返回的值为null。您可能希望从那里的该表中返回一些其他值。

示例结果:

firmID  settingname  settingIDFK
1       add user     42
1       delete user  null
1       save user    76
2       add user     14
2       save user    null
2       delete user  null

要过滤掉特定公司的数据,您只需添加一个where子句。例子:

select f.FirmID, l.settingname, u.settingIDFK
from
  tblFirm as f
  cross join tblSettingsLookup as l
  left join tblusersettingsforfirms u
    on u.settingIDFK = l.settingID and u.firmIDFK = f.FirmID
where f.firmID = 15
于 2012-04-09T17:59:24.000 回答
0

你在寻找这样的东西吗?

    SELECT `tblFirm`.`firmid`, `tblusersettingsforfirm`.`settingname`  
    FROM `tblFirm`, `tblusersettingsforfirm`
    WHERE (`tblFirm`.`firmid` =  
    `tblusersettingsforfirm`.`firmIDFK`)
于 2012-04-09T17:42:12.227 回答
0

虽然您的描述不是那么清楚(这将有助于显示您想要加入的两个表中的数据以及预期的输出),但我看来,您想简单地显示每个公司的每个设置记录的一个实例。也就是说,实际上,交叉连接(或笛卡尔积):

 SELECT tblFirm.FirmID, tblSettingsLookup.setting_name
   FROM tblFirm, tblSettingsLookup
于 2012-04-09T17:49:52.893 回答