mysql 返回xml_MYSQL UDF函数返回XML

情况:

我想创建一个名为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位服务器上如何安装此操作的任何答案也是可以接受的.

请考虑到我没有制作,制作文件等的经验,所以请详细说明.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值