Php SQL查询:按ntext字段分组
我有下面的查询,它基本上检索了销量最高的5本书:Php SQL查询:按ntext字段分组,php,sql,sql-server,Php,Sql,Sql Server,我有下面的查询,它基本上检索了销量最高的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_c
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
问题是我收到了以下错误:
文本、ntext和图像数据类型
无法进行比较或排序,除非
当使用IS NULL或LIKE运算符时
在books\u book
表中,字段desc\u book
的类型为ntext
,我确信问题来自于此
这是因为在我将desc_book
更改为ntext
之前,它属于nvarchar
类型,并且工作得非常好
我之所以更改此字段的数据类型,是因为在PHP网站中,当我显示图书描述(另一个sp)时,描述被截断为大约200-255个字符,因此我将其更改为ntext
,它“解决了我的问题”(即,整个desc_图书
最终被显示)
所以基本上我的问题是:
desc_book
(nvarchar)字段时会被截断?ntext
字段进行分组?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;
首先,不要使用bk.*,而是使用实际需要的列的完整列列表 我不能回答问题1,但下面是问题2的答案:不要在
desc_book
上选择并分组,而是这样进行转换:cast(desc_book AS NVARCHAR(2000))AS desc_book
(或其他适当大小的NVARCHAR) 旧的PHP“mssql”扩展只支持最大255字节的VARCHAR。这是一个已知的限制,这也是为什么Microsoft一直在开发一个新的PHP扩展来支持现代SQL Server版本
一种解决方法是将该列的存储声明为NVARCHAR,但是当您从PHP查询它时,请使用CAST将其转换为NTEXT。然后可以返回完整长度
另一个选项是保持列存储为NTEXT,但通过将计数放入子查询,仅按book\u 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);
优秀…尝试并测试了您的解决方案;两者都能完美地工作。