Php SQL查询:按ntext字段分组

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

我有下面的查询,它基本上检索了销量最高的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 
问题是我收到了以下错误:

文本、ntext和图像数据类型 无法进行比较或排序,除非 当使用IS NULL或LIKE运算符时

books\u book
表中,字段
desc\u book
的类型为
ntext
,我确信问题来自于此

这是因为在我将
desc_book
更改为
ntext
之前,它属于
nvarchar
类型,并且工作得非常好

我之所以更改此字段的数据类型,是因为在PHP网站中,当我显示图书描述(另一个sp)时,描述被截断为大约200-255个字符,因此我将其更改为
ntext
,它“解决了我的问题”(即,整个
desc_图书
最终被显示)

所以基本上我的问题是:

  • 为什么在PHP页面中显示
    desc_book
    (nvarchar)字段时会被截断?
  • 如何修复SQL查询以适应通过
    ntext
    字段进行分组?
  • 为了记录在案(我认为这与此无关),我使用的是MS SQL Server 2005

    [更新]

    我尝试并测试了两个提出的解决方案,它们都非常有效。因此,我决定将计数聚合结果分组到一个子查询中……即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;
    

    首先,不要使用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);
    

    优秀…尝试并测试了您的解决方案;两者都能完美地工作。