2

好的,我认为必须有一种更简单的方法来做到这一点,我想动态地做,而不是手写每一行。我对 MySQL 比对 SQL Server 2008 更熟悉,但我也不确定如何在 MySQL 中做到这一点。

我有 3 张桌子。

Table 1:  USER       id | email | password
Table 2:  METADATA   id | name   (list of fields I need to know about user)
Table 3: USER_META   id | uid | name | value (where I store the user meta data)

我没有对 METADATA 进行硬编码,因为它会针对此应用程序的每个实例进行更改。但在这个例子中,假设元数据是“眼睛”、“电话”、“城市”(实际上还有很多,本周可能有 20 个,下周可能有 40 个)

所以它的工作方式是当用户注册时,我使用 METADATA 表构建注册表单来构建表单。它创建了一个带有“眼睛”、“电话”和“城市”的表格。

当我保存表单时,我将单个记录保存到USER_META每个数据项的表中。因此,在注册时,我得到 3 个插入:

  insert into USER_META(uid,name,value) values (5,"eyes","brown")
  insert into USER_META(uid,name,value) values (5,"phone","555-1212")
  insert into USER_META(uid,name,value) values (5,"city","San Francisco")

现在,我想编写一个存储过程,它将返回这样的记录“

EXECUTE Get_Meta 5

返回:

uid |  email  |  eyes | phone | city
5    x@x.com    brown   555-1212  San Francisco;

我可以编写一个长的硬编码选择语句,例如:

DECLARE @UID int;
SELECT  id, email,  
(select value from USER_META
 where uid = @UID and name = 'EYES') as EYES,
(select value from USER_META
 where uid = @UID and name = 'PHONE') as PHONE,
(select value from USER_META
 where uid = @UID and name = 'CITY') as CITY,
FROM  USER 
where id = @UID;

但是这种方式违背了整个目的,每当元数据需求发生变化时(例如,当我们启动另一个实例时),我必须每周重新编写它。

我想要这样的东西:(请原谅我对高级 SQL 不是很有经验,所以也许这很简单,我只是不知道该怎么做?)我会用基本的代码术语编写它来尝试和解释我的想法:

DECLARE @UID int;
DECLARE @META_NAMES array;
@META_NAMES = (select NAME from METADATA);

SELECT  id, email,  
 for each (@META_NAMES as $THIS_NAME) {

  (select value from USER_META
   where uid = @UID and name = '$THIS_NAME') as $THIS_NAME,

}
FROM  USER 
where id = @UID;

有没有办法在 SQL Server 2008 中编写它?

4

1 回答 1

1

您将在 SQL Server 中使用 FOR XML_PATH。GROUP_CONCAT 的解决方法

SELECT
    U.UID,
    U.EMAIL,
    stuff(
    (
    select cast(',' as varchar(max)) + name + '=' + Value
    from USER_META
    WHERE UID = U.UID
    for xml path('')
    ), 1, 1, '') AS M
FROM
    USERS U

SQL小提琴

于 2013-06-18T01:37:24.173 回答