我有以下查询,基本上它检索了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运算符时。
在books_book
表格中,字段desc_book
的类型为ntext
,我确信问题来自那里。
这是因为在我将desc_book
更改为ntext
之前,它的类型为nvarchar
,而且效果非常好。
我更改此字段的数据类型的原因是因为在PHP网站中,当我显示书籍描述(不同的sp)时,描述被截断为大约200-255个字符,因此我将其更改为ntext
并且“解决了我的问题”(即,最终显示了整个desc_book
)。
基本上这些是我的问题:
desc_book
(nvarchar)字段在PHP页面中显示时会被截断? ntext
字段的分组? 仅供记录(我认为不相关),我正在使用 MS SQL Server 2005
[UPDATE]
我尝试并测试了Bill Karwin提出的两种解决方案,它们都完美无缺。因此,我决定将计数聚合结果分组为子查询...即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;
答案 0 :(得分:5)
旧的PHP“mssql”扩展仅支持最大255字节的VARCHAR。这是一个已知的限制,这就是为什么Microsoft一直在开发一个新的PHP扩展来支持现代SQL Server版本。
一种解决方法是将该列的存储声明为NVARCHAR,但是当您从PHP查询它时,请使用CAST将其转换为NTEXT。然后可以返回全长。
另一种选择是将列存储为NTEXT,但将GROUP存储为子查询,只将book_id
存储为:{/ p>
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);
答案 1 :(得分:0)
首先,不要使用bk。*,使用您实际需要的列的完整列列表。
我无法回答问题1,但这里是对问题2的回答:而不是在desc_book
上选择和分组,而是将其转换为:CAST(desc_book AS NVARCHAR(2000)) AS desc_book
(或其他适当大小的nvarchar )。