And*_*ech 2 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_ctg_book,qty_book,image_book,isdeleted
order by 'books_sold' desc
Run Code Online (Sandbox Code Playgroud)
问题是我收到此错误:
除非使用IS NULL或LIKE运算符,否则无法比较或排序text,ntext和image数据类型.
在books_book表中,字段desc_book是类型ntext,我确信问题来自那里.
这是因为在此之前我改变了desc_book对ntext,它是类型的nvarchar它完美地工作.
我更改此字段的数据类型的原因是因为在PHP网站中,当我显示书籍描述(不同的sp)时,描述被截断为大约200-255个字符,因此我将其更改为" ntext它"解决了我的问题'(即整体desc_book最终被展示).
基本上这些是我的问题:
desc_book在PHP页面中显示时会截断(nvarchar)字段?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;
Run Code Online (Sandbox Code Playgroud)
旧的PHP"mssql"扩展仅支持最大255字节的VARCHAR.这是一个已知的限制,这就是为什么Microsoft一直在开发一个新的PHP扩展来支持现代SQL Server版本.
一种解决方法是将该列的存储声明为NVARCHAR,但是当您从PHP查询时,使用CAST将其转换为NTEXT.然后可以返回全长.
另一种选择是将列保存为NTEXT,但仅book_id将GROUP 计数存入子查询:
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);
Run Code Online (Sandbox Code Playgroud)