我有以下查询,该查询基本上检索出销量最高的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
问题是我收到此错误:
除非使用IS NULL或LIKE运算符,否则无法对text,ntext和image数据类型进行比较或排序。
在books_book表中,该字段desc_book的类型为ntext,我确定问题出在那儿。
books_book
desc_book
ntext
这是因为在我将desc_bookto更改为之前ntext,它是类型nvarchar,并且运行良好。
nvarchar
之所以更改此字段的数据类型,是因为在PHP网站中,以某种方式显示图书说明(一个不同的sp)时,说明被截断为大约200-255个字符,因此我将其更改为ntextand’解决了我的问题”(即desc_book最终显示了整个问题)。
所以基本上这些是我的问题:
仅出于记录目的(我认为这不太相关),我使用的是 MS SQL Server 2005
[更新] 这是我更新的(完全正常运行的)语句:
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;
旧的PHP“ mssql”扩展名仅支持最大255个字节的VARCHAR。这是一个已知的限制,这就是Microsoft一直在开发新的PHP扩展以支持现代SQL Server版本的原因。
一种解决方法是将该列的存储声明为NVARCHAR,但是从PHP查询该列时,请使用CAST将其转换为NTEXT。然后可以返回完整长度。
另一个选择是将列存储为NTEXT,但仅book_id通过将计数放入子查询中来存储GROUP BY :
book_id
SELECT bk.*, bc.books_sold FROM books_book bk INNER JOIN (SELECT bk2.book_id, COUNT(*) books_sold FROM books_book bk2 INNER JOIN orderdetails_orddetails ord ON (bk2.id_book = ord.id_book_orddetails) GROUP BY bk2.book_id) bc ON (bk.book_id = bc.book_id);