SQL查询:按ntext字段分组

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_bookntext,它是类型的nvarchar它完美地工作.

我更改此字段的数据类型的原因是因为在PHP网站中,当我显示书籍描述(不同的sp)时,描述被截断为大约200-255个字符,因此我将其更改为" ntext它"解决了我的问题'(即整体desc_book最终被展示).

基本上这些是我的问题:

  1. 为什么desc_book在PHP页面中显示时会截断(nvarchar)字段?
  2. 如何修复SQL查询以适应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)

Bil*_*win 5

旧的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)