我有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 |长度|速度| --------。----------------。---------------- .-
负载:
--------。---------------- .----------------。 | Id |长度|速度| --------。----------------。---------------- .-
COMMAND: loadRanking 2 (k = 2,所以我想在一些ORDER之后获得前两行,不要在这个结果中谈论ORDER)
结果:
--------。---------------- .----------------。 | Id |长度|速度| --------。----------------。---------------- .-
答案 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
附加说明:在将查询设置为视图之前,请尝试确保查询有效。