admin

SQL查询:按ntext字段分组

sql

我有以下查询,该查询基本上检索出销量最高的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

问题是我收到此错误:

除非使用IS NULL或LIKE运算符,否则无法对text,ntext和image数据类型进行比较或排序。

books_book表中,该字段desc_book的类型为ntext,我确定问题出在那儿。

这是因为在我将desc_bookto更改为之前ntext,它是类型nvarchar,并且运行良好。

之所以更改此字段的数据类型,是因为在PHP网站中,以某种方式显示图书说明(一个不同的sp)时,说明被截断为大约200-255个字符,因此我将其更改为ntextand’解决了我的问题”(即desc_book最终显示了整个问题)。

所以基本上这些是我的问题:

  1. 为什么desc_book(nvarchar)字段在PHP页面中显示时被截断?
  2. 如何修复SQL查询以适应按ntext字段分组?

仅出于记录目的(我认为这不太相关),我使用的是 MS SQL Server 2005

[更新]
这是我更新的(完全正常运行的)语句:

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;

阅读 218

收藏
2021-07-01

共1个答案

admin

旧的PHP“ mssql”扩展名仅支持最大255个字节的VARCHAR。这是一个已知的限制,这就是Microsoft一直在开发新的PHP扩展以支持现代SQL
Server版本的原因。

一种解决方法是将该列的存储声明为NVARCHAR,但是从PHP查询该列时,请使用CAST将其转换为NTEXT。然后可以返回完整长度。

另一个选择是将列存储为NTEXT,但仅book_id通过将计数放入子查询中来存储GROUP BY :

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);
2021-07-01