情况:
我想创建一个名为XMLify的mysql函数,它接收一个字符串和一个返回一个集合的表达式
XMLify(string,expr)
该函数应该将每个返回的行的返回字段包装到其自己的XML标签中.标签的名称应该是字段名称.
小例子:
select XMLify('foo', (SELECT 1 as `a`, 2 as `b` UNION SELECT 3 as `a`, 4 as `b`));
应该返回:
1234
我想要这样做,因为它将使我能够使用许多连接和/或从属子查询来运行复杂的查询,而无需向客户端返回冗余数据.
我已经有一个工作,没有我想要建立的功能.但这涉及编写难以维护的困难查询.
看我下面的例子.
确保字段名称是合法的XML节点名称是为了后来的担心.一旦功能正常,我会想到一些算法,它将使用字段名称并将其转换成一些合法的XML节点名称.
还可以避免XML数据的烦恼.这将使用名为CDATAify的不同函数完成,它将简单地将所有数据包装到中,并且将逃避任何先前发生的]].在数据中]]]]>
>要概述,我想有一个MySQL函数,我可以传递一个表达式或结果集,我也可以使用结果集的字段名称.
我假定在存储的函数中这是不可能的吗?
UDF会把expessions /他们的结果作为一个参数吗?
> UDF允许我访问结果集的字段名称,所以我可以使用它们作为XML标签名称
>它会在Windows上工作吗?我读到UDF有一些限制
有没有更好的方法我还没有想到?
>我可以有一个UDF .dll,我可以在我自己的开发计算机上创建,然后将.dll文件复制到我的服务器,并在那里使用它?
>如何让这个节目在卷上?请仔细考虑,我在Windows计算机上有MySQL 5.5 64位.
例:
想象一下,有以下3个表格:
users: grades: toys:
+----+------+ +--------+-------+ +--------+--------------+
| id | name | | userid | grade | | userid | toy |
+----+------+ +--------+-------+ +--------+--------------+
| 1 | Bart | | 1 | E | | 1 | slingshot |
| 2 | Lisa | | 1 | E | | 1 | Krusty |
| .. | ... | | 2 | A | | 2 | Malibu Stacy |
| .. | ... | | 2 | B | | 2 | calculator |
+----+------+ +--------+-------+ +--------+--------------+
我想要的结果是,限于巴特和丽莎:
考虑:
>我不想在PHP或C#中首先查询用户表,然后每个用户对成绩和玩具运行两个额外的查询.因为1000用户,我将运行2001查询.
>我也不想运行一个所有连接的查询,并通过PHP或C#中的结果集,因为用户名将被发送多少次数等于玩具数量.想象一下,用户字段包含一个巨大的blob!
>我不能简单地在连接的表上使用GROUP_CONCAT,因为成绩/玩具仍然会出现双倍.
>如果我使用GROUP_CONCAT与DISTINCT,我将失去的成绩是相同的,如Bart的两个E的.
所以目前我将使用以下语句来获得这个结果,涉及两个相关的子查询.这很好:
SELECT
CONCAT(
'',
IFNULL(
GROUP_CONCAT(
'',
'
REPLACE(u.id,']]>',']]]]>'),
']]>
','
REPLACE(u.name,']]>',']]]]>'),
']]>
','',
(
SELECT
IFNULL(
GROUP_CONCAT(
'
REPLACE(g.grade,']]>',']]]]>'),
']]>
'SEPARATOR ''
),
'')
FROM
grades g
WHERE
g.userid = u.id
),
'',
'',
(
SELECT
IFNULL(
GROUP_CONCAT(
'
REPLACE(t.toy,']]>',']]]]>'),
']]>
'SEPARATOR ''
),
'')
FROM
toys t
WHERE
t.userid = u.id
),
'',
''
SEPARATOR ''
),
''
),
''
)
FROM
users u
WHERE
u.name = 'Bart' or u.name = 'Lisa'
;
现在你可能会注意到,这是一个相当大而丑的查询,在阅读时会伤害到眼睛.
维持这样的查询是很困难的.
如果我有我的功能XMLify和CDATAify,我可以简单地写这个:
SELECT
XMLify('users',(
XMLify('user',(
SELECT
CDATAify(u.id) as id,
CDATAify(u.name) as name,
XMLify('grade',(
SELECT
CDATAify(g.grade) as grade
FROM
grades g
where
g.userid = u.id
)) AS grades,
XMLify('toys',(
SELECT
CDATAify(t.toy) as toy
FROM
toys t
where
t.userid = u.id
)) AS grades
FROM
users u
WHERE
u.name = 'Bart' or u.name = 'Lisa'
))
))
;
编辑:
正如N.B.的评论所述,有一个repository on Github,可能需要我所需要的.不过,我花了好几天时间才试图让这个工作在我的系统上工作,没有成功.对于在Windows上运行的MySQL 5.5 64位服务器上如何安装此操作的任何答案也是可以接受的.
请考虑到我没有制作,制作文件等的经验,所以请详细说明.