簡體   English   中英

SQL查詢:按ntext字段分組

[英]SQL Query: Grouping by an ntext field

我有以下查詢,該查詢基本上檢索出銷量最高的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_book更改為ntext ,它的類型為nvarchar ,並且運行良好。

之所以更改此字段的數據類型,是因為在PHP網站中,以某種方式顯示圖書說明(一個不同的sp)時,說明被截斷為大約200-255個字符,因此我將其更改為ntext , “解決了我的問題”(即最終顯示了整個desc_book )。

所以基本上這些是我的問題:

  1. 為什么在PHP頁面中顯示desc_book (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;

舊的PHP“ mssql”擴展僅支持最大255個字節的VARCHAR。 這是一個已知的限制,這就是為什么Microsoft一直在開發新的PHP擴展以支持現代SQL Server版本的原因。

一種解決方法是將該列的存儲聲明為NVARCHAR,但是當您從PHP查詢它時,請使用CAST將其轉換為NTEXT。 然后可以返回完整長度。

另一個選擇是將列存儲為NTEXT,但將計數放入子查詢中,使GROUP BY僅book_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);

首先,不要使用bk。*,而是使用實際需要的列的完整列列表。

我無法回答問題1,但這是問題2的答案,而不是在desc_book上進行選擇和分組,而不是像這樣對它進行desc_bookCAST(desc_book AS NVARCHAR(2000)) AS desc_book (或nvarchar的其他適當大小) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM