如何在新视图中按新索引分组
Posted
技术标签:
【中文标题】如何在新视图中按新索引分组【英文标题】:How to GROUP BY a new index in a new VIEW 【发布时间】:2015-05-14 02:42:04 【问题描述】:我有 2 个表(负载 + 道路),我想创建一个新视图,通过创建新列(标志)来索引行的 COUNT,然后按这个新索引进行分组。 我试过这个:(但它不起作用)
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");
错误: 执行查询时出错:错误:列“road.id”必须出现在 GROUP BY 子句中或用于聚合函数中
我正在使用我的 SQL。
*编辑:
我不希望新列(标志)出现在最后一个 SELECT 中,但我想按它分组.. 不知道是否可以完成。如果没有,我想达到的事情是在“SELECT id,Rlength,Llength”上使用 group by 并将所有行放在一个组中,但是我在这些行之间没有 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)
道路:
.---------------------------------------------------------- |身份证 |长度 |速度 | .--------.--------------------------------------------------
| 9 | 55 | 90 |
| 10 | 44 | 80 |
| 11 | 70 | 100 |
加载:
.---------------------------------------------------------- |身份证 |长度 |速度 | .--------.--------------------------------------------------
| 9 | 10 | 20 |
| 10 | 15 | 30 |
| 11 | 30 | 60 |
命令: loadRanking 2 (k=2,所以我想在某个 ORDER 之后得到前 2 行,我们先不讨论这个结果中的 ORDER)
结果:
.---------------------------------------------------------- |身份证 |长度 |速度 | .--------.--------------------------------------------------
| 9 | 10/55 | 20/90 |
| 10 | 15/44 | 30/80 |
【问题讨论】:
你真的应该向我们展示一些你想要得到的样本输出。否则,我们无法确定地向您提供查询。 好的,我会编辑的。谢谢 【参考方案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
附加说明:在将其放入视图之前,请尝试确保您的查询有效。
【讨论】:
哦,你想要每个 id 的最小值和最大值吗?让我看看我能为你解决什么问题。 这与 id 无关...我只想在不使用 LIMIT 的情况下获得前 k 行 我没有足够的代表来回复您的原始帖子。我还是不太明白你想要什么。速度从何而来?你只是想把两张桌子结合起来吗?为什么 id of 11 没有包含在结果中?我想如果你发布了实际的作业问题,我可以指导你正确的方向。 问题是否可能希望您使用 php 来限制结果?像这样的东西? http://***.com/a/17070820/3843101 我想在不使用 LIMIT 的情况下进行限制,是的。但什么是 PHP?我在 c 中使用我的 SQL。以上是关于如何在新视图中按新索引分组的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI 如何在新视图中链接 ForEach 索引和照片索引?