[英]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
)。
所以基本上這些是我的問題:
desc_book
(nvarchar)字段時會被截斷? 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_book
: CAST(desc_book AS NVARCHAR(2000)) AS desc_book
(或nvarchar的其他適當大小) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.