SQL查询:按ntext字段分组

时间:2008-12-21 20:45:04

标签: 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 

问题是我收到此错误:

  

text,ntext和image数据类型   无法比较或排序,除外   当使用IS NULL或LIKE运算符时。

books_book表格中,字段desc_book的类型为ntext,我确信问题来自那里。

这是因为在我将desc_book更改为ntext之前,它的类型为nvarchar,而且效果非常好。

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

基本上这些是我的问题:

  1. 为什么desc_book(nvarchar)字段在PHP页面中显示时会被截断?
  2. 如何修复SQL查询以适应ntext字段的分组?
  3. 仅供记录(我认为不相关),我正在使用 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;
    

2 个答案:

答案 0 :(得分:5)

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

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

另一种选择是将列存储为NTEXT,但将GROUP存储为子查询,只将book_id存储为:{/ p>

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);

答案 1 :(得分:0)

首先,不要使用bk。*,使用您实际需要的列的完整列列表。

我无法回答问题1,但这里是对问题2的回答:而不是在desc_book上选择和分组,而是将其转换为:CAST(desc_book AS NVARCHAR(2000)) AS desc_book(或其他适当大小的nvarchar )。