【发布时间】:2026-01-07 19:00:01
【问题描述】:
首先让我解释一下我的数据库结构。
我使用 MSSQL 和 php 的 sqlsrv 驱动程序。
我有两个数据库表 Names 和 AccountFieldValues。
Names 有一个变量字段 NameID 和一个固定字段 StringValue。
此表包含帐户字段变量的所有名称:FirstName、LastName 等。
AccountFieldValues 具有相同的变量字段 FieldNameID、FieldValue 和 IdentityID。
此表包含每个用户的帐户字段变量的内容。
现在要获取 IdentityID=10 和 StringValue='FirstName' 的用户的特定变量内容,您可以创建如下查询:
SELECT FieldValue FROM AccountFieldValues
WHERE IdentityID=10 AND FieldNameID IN (SELECT NameID FROM Names WHERE StringValue='FirstName')
或者使用内部连接
SELECT ACF.FieldValue FROM AccountFieldValues ACF
INNER JOIN Names N ON (N.StringValue='FirstName' AND N.NameID=ACF.FieldNameID)
WHERE ACF.IdentityID=10
当您想要单个变量内容时,两种方法都可以正常工作。
但是现在问题来了,当我想在一个查询中获取多个变量内容时,这变得很棘手。
我可以像这样展开这两个查询:
SELECT FieldValue FROM AccountFieldValues
WHERE IdentityID=10 AND FieldNameID IN
(SELECT NameID FROM Names WHERE StringValue='FirstName' OR StringValue='LastName')
另外一个查询是这样的:
SELECT ACF.FieldValue AS 'FirstName', ACF2.FieldValue AS 'LastName' FROM AccountFieldValues ACF
INNER JOIN Names N ON (N.StringValue='FirstName' AND N.NameID=ACF.FieldNameID)
INNER JOIN AccountFieldValues ACF2 ON (ACF2.IdentityID=ACF.IdentityID)
INNER JOIN Names N2 ON (N2.StringValue='LastName' AND N2.NameID=ACF2.FieldNameID)
WHERE ACF.IdentityID=10
虽然与上面的方法相比丑得要命,但这会给我一个结果行中的 FirstName 和 LastName 的结果。像这样:
FirstName|LastName
------------------
Foo |Bar
另一方面,第一个方法会给我一个如下所示的结果:
FieldValue
----------
Foo
Bar
这是不可取的,因为我无法为一个结果集中的每个用户获取所需的 AccountFieldValues
有没有一种方法可以像使用丑陋的联接一样获得表格的结果,但像第一种方法一样更快、更容易扩展?
【问题讨论】:
-
这是Entity-attribute-value 设计。
标签: php sql sql-server resultset