为什么这个Sql语句不能正确地“排序”
我有sql:为什么这个Sql语句不能正确地“排序”,sql,group-by,sql-order-by,Sql,Group By,Sql Order By,我有sql: SELECT t.TagText, COUNT(*) AS NumVidsWithTag FROM tbl_Tag t INNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId INNER JOIN tbl_Video v ON x.VideoId=v.VideoId WHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref WHERE VideoId=6 AND TagId
SELECT t.TagText, COUNT(*) AS NumVidsWithTag
FROM tbl_Tag t
INNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId
INNER JOIN tbl_Video v ON x.VideoId=v.VideoId
WHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref WHERE VideoId=6 AND TagId=t.TagId)
GROUP BY t.TagText
返回:
1 1
10 1
11 1
12 1
13 1
14 1
15 1
16 1
17 1
18 1
19 1
2 1
20 1
然后我将sql更改为
SELECT t.TagText, COUNT(*) AS NumVidsWithTag
FROM tbl_Tag t
INNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId
INNER JOIN tbl_Video v ON x.VideoId=v.VideoId
WHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref WHERE VideoId=6 AND TagId=t.TagId)
GROUP BY t.TagText
ORDER BY t.TagText ASC
它仍然是:
1 1
10 1
11 1
12 1
13 1
14 1
15 1
16 1
17 1
18 1
19 1
2 1
20 1
我不明白为什么不能正确排序?看起来TagText是一个varchar字段,而不是一个数字。SQL将根据文本排序规则对varchar字段进行排序-Aa位于B之前,因此19位于2之前。这就是为什么列的数据类型不是整数。它是字符串,并像字符串一样排序 因此2在19之后
可能的解决方案是:将列的数据类型更改为整数我假设t.TagText是一个字符字段?订单将使用此字段的ASCII值进行排序。上述排序顺序是正确的 假设tbl_Tag.TagText columns数据类型为varchar或类似类型 在这种情况下,这是正确排序-字母数字排序,19在2之前;11点之前会有100点 您需要将数据类型更改为数字类型 您可以在不更改表的架构的情况下执行此操作:
SELECT t.TagText, COUNT(*) AS NumVidsWithTag
FROM tbl_Tag tINNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId
INNER JOIN tbl_Video v ON x.VideoId=v.VideoId
WHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref WHERE VideoId=6 AND TagId=t.TagId)
GROUP BY t.TagText
ORDER BY CONVERT(int, t.TagText) ASC
本质上,只要更改ORDER BY子句,将TagText列转换为int类型,就可以正确排序 TagText是一个字符串,因此11比2小 若要按数字排序,请将订单更改为
ORDER BY CONVERT(INT, t.TagText) ASC
我认为这是排序错误,因为order列是text varchar/nvarchar。尝试在sql语句的select部分转换为int 如果需要,在此处强制转换/转换帮助
TagText是一个字符字段nvarchar?正在按字母数字排序 您需要将其转换为数字格式以进行排序
SELECT t.TagText, COUNT(*) AS NumVidsWithTag
FROM tbl_Tag t
INNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId
INNER JOIN tbl_Video v ON x.VideoId=v.VideoIdWHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref
WHERE VideoId=6 AND TagId=t.TagId)
GROUP BY t.TagText ORDER BY CONVERT(INT, t.TagText) ASC
p、 s视频id只是一个替换的参数!为什么名称是TagText而不是TagNumber?: