如何在新视图中对新索引进行分组

时间:2015-05-14 02:42:05

标签: sql view group-by

我有2个表(加载+道路),我想创建一个新视图,创建新的列(标志),索引行的COUNT,然后GROUP BY这个新索引。 我试过这个:(但它不起作用)

sprintf(my_cmd, 
"CREATE VIEW myVIEW(id, Rlength, Llength, flag) AS "
"SELECT road.id, road.length, load.length, COUNT(*) AS flag 
FROM road, load "
"WHERE road.id=load.id; "
"SELECT id, Rlength, Llength 
FROM myVIEW"
"GROUP BY flag");

错误: 执行查询时出错:ERROR:列“road.id”必须出现在GROUP BY子句中或用于聚合函数

我正在使用MY SQL。

*编辑:

我不希望新列(标志)出现在最后一个SELECT中,但我想按它分组..不知道是否可以完成。如果没有,我想要达到的目的是使用group by on“SELECT id,Rlength,Llength”并将所有行都放在一个组中,但是我没有在这些行之间有一个Common参数,所以我试图添加这个“旗帜”

完整的代码(抱歉很长的问题):

sprintf(my_cmd, 
"CREATE VIEW myVIEW3(id, Rlength, Llength, flag) AS"
" SELECT road.id, road.length, load.length, COUNT(*) AS flag 
FROM road, load"
" WHERE road.id=load.id;"
" SELECT id, Rlength, Llength FROM myVIEW3"
" GROUP BY flag"
" HAVING COUNT(*) <= %d"
" ORDER BY (CAST(Llength AS float) / CAST(Rlength AS float)) DESC, id DESC",k);

和我想要做的是,在不使用LIMIT / TOP(它是一个分配)的情况下进行一些ORDER后得到前k行。所以我尝试使用新的VIEW和一些我将用于将所有行分组到一个组中的默认值,然后使用HAVING COUNT(flag)&lt; = k。

路:

--------。---------------- .----------------。 | Id |长度|速度| --------。----------------。---------------- .-

| 9 | 55 | 90 |

| 10 | 44 | 80 |

| 11 | 70 | 100 |

负载:

--------。---------------- .----------------。 | Id |长度|速度| --------。----------------。---------------- .-

| 9 | 10 | 20 |

| 10 | 15 | 30 |

| 11 | 30 | 60 |

COMMAND:  loadRanking 2  (k = 2,所以我想在一些ORDER之后获得前两行,不要在这个结果中谈论ORDER)

结果:

--------。---------------- .----------------。 | Id |长度|速度| --------。----------------。---------------- .-

| 9 | 10/55 | 20/90 |

| 10 | 15/44 | 30/80 |

1 个答案:

答案 0 :(得分:1)

您的group by应包含所选的不属于聚合函数的列。所以你的GROUP BY应该是这样的:

GROUP BY road.id, road.length, load.length

话虽如此,我很困惑为什么你在这里有两个疑问。我怀疑你的查询应该是这样的:

SELECT road.id, road.length, load.length, COUNT(*) AS flag 
FROM road, load 
WHERE road.id=load.id
GROUP BY road.id, road.length, load.length
HAVING COUNT(*) <= %d
 ORDER BY (CAST(load.length AS float) / CAST(road.length AS float)) DESC, road.id DESC

The GROUP BY Statement

附加说明:在将查询设置为视图之前,请尝试确保查询有效。