我有以下查询,它基本上检索销量最高的 5 本书:
select top 5 count(id_book_orddetails) 'books_sold', bk.*
from orderdetails_orddetails ord inner join books_book bk
on ord.id_book_orddetails = bk.id_book
group by id_book, name_book,author_book,desc_book,id_ctg_book,qty_book,image_book,isdeleted
order by 'books_sold' desc
问题是我收到此错误:
text、ntext 和 image 数据类型
不能比较或排序,除了
当使用 IS NULL 或 LIKE 运算符时。
In the books_book
表、字段desc_book
属于类型ntext
,而且我确信问题就来自那里。
这是因为在我改变之前desc_book
to ntext
,它的类型是nvarchar
它工作得很好。
我更改此字段的数据类型的原因是因为在 PHP 网站中,当我显示书籍描述(不同的 sp)时,描述被截断为大约 200-255 个字符,因此我将其更改为ntext
它“解决了我的问题”(即整个desc_book
终于被展示出来了)。
基本上这些是我的问题:
- 为什么是
desc_book
(nvarchar) 字段在 PHP 页面中显示时被截断?
- 我如何修复 SQL 查询以适应按分组分组
ntext
field?
只是为了记录(我认为这不是很相关),我正在使用微软 SQL Server 2005
[UPDATE]
我尝试并测试了两者比尔·卡尔文 https://stackoverflow.com/questions/384923/sql-query-grouping-by-an-ntext-field#384957提出的解决方案,它们都工作得很好。因此,我决定将计数聚合结果分组到子查询中......即 Karwin 的后一个解决方案。
这是我更新的(完全有效的)声明:
SELECT bk.*, bc.books_sold
FROM books_book bk
INNER JOIN (
SELECT bk2.id_book, COUNT(*) books_sold
FROM books_book bk2
INNER JOIN orderdetails_orddetails ord
ON (bk2.id_book = ord.id_book_orddetails)
GROUP BY bk2.id_book
) bc
ON (bk.id_book = bc.id_book)
ORDER BY books_sold desc;