2017-04-11 93 views
2

是否有可能创建一个接受作为参数,结果从查询中设置一个MySQL的功能?创建一个接受结果集作为参数的mysql函数?

基本上,我有很多的查询将返回以下结果的结果集:

 
    id | score 
    70 | 25 
    71 | 7 
    72 | 215 
    74 | 32 
    75 | 710 
    76 | 34 
    78 | 998 
    79 | 103 
    80 | 3 

我想正常化值,使得他们来到一个范围在0和1 的方式我之间以为我会做到这一点是通过应用计算:

nscore = (score-min(score))/(max(score) - min(score))

得到以下结果

 
    id | score 
    70 | 0.022 
    71 | 0.004 
    72 | 0.213 
    74 | 0.029 
    75 | 0.710 
    76 | 0.031 
    78 | 1.000 
    79 | 0.100 
    80 | 0.000 

但我没能拿出一个查询来获取与结果一起此查询的最小值和最大值,因此想使用的功能(不能使用存储过程),但不能就如何通过文档结果集。

任何帮助表示赞赏!
谢谢!

编辑: 在结果的得分字段是一个计算字段。无法直接选择它。

对于如:样本查询,返回上述结果 - select t.id as id, count(*) as score from tbl t inner join tbl2 t2 on t.idx = t2.idx where t2.role in (.....) 仅用于演示目的,而不是实际的模式或查询

回答

1

号MySQL不支持用一个结果定义为自变量的函数。

不幸的是,MySQL不支持通用表表达式(CTE),并且不支持分析功能。

要从MySQL查询得到这样的结果......一个办法做到这一点在MySQL需要原来的查询应退为内嵌视图,倍......

举个例子:

SELECT t.id 
    , (t.score-s.min_score)/(s.max_score-s.min_score) AS normalized_score 
    FROM ( 
     -- original query here 
     SELECT id, score FROM ... 
     ) t 
CROSS 
    JOIN (SELECT MIN(r.score) AS min_score 
       , MAX(r.score) AS max_score 
      FROM (
        -- original query here 
        SELECT id, score FROM ... 
       ) r 
     ) s 
ORDER BY t.id 

编辑

基于查询的加入问题...

SELECT q.id 
    , (q.score-s.min_score)/(s.max_score-s.min_score) AS normalized_score 
    FROM (-- original query goes here 
     -- ------------------------ 

        select t.id as id, count(*) as score 
        from tbl t 
        inner join tbl2 t2 on t.idx = t2.idx 
        where t2.role in (.....) 

     -- ------------------------ 
     ) q 
CROSS 
    JOIN (SELECT MIN(r.score) AS min_score 
       , MAX(r.score) AS max_score 
      FROM (-- original query goes here 
        -- ------------------------ 

        select t.id as id, count(*) as score 
        from tbl t 
        inner join tbl2 t2 on t.idx = t2.idx 
        where t2.role in (.....) 

        -- ------------------------ 
       ) r 
     ) s 
ORDER BY q.id 
+0

我很抱歉。忘了提及一个重要的细节。结果中的分数字段是一个计算字段。无法直接选择它。编辑问题以反映这一点。 – arunondeck

+1

“计算场”不应该成为问题。我们只需要一个返回有效结果集的查询。完整的查询进入parens。不幸的是,相同的查询必须指定两次。 – spencer7593

+0

是的长度是问题,尤其是当有多个连接。但是,猜猜这将不得不做。 谢谢@ spencer7593 – arunondeck

相关问题