У меня есть запрос ниже, который в основном возвращает 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
).
Так что в основном это мои вопросы:
- Почему поле
desc_book
(nvarchar) обрезается при отображении на странице PHP?
- Как я могу исправить SQL-запрос для группировки по полю
ntext
?
Просто для записи (которую я не считаю очень важной) я использую MS SQL Server 2005
[UPDATE]
Я попробовал и протестировал оба предложенных решения Билла Карвина , и оба они отлично работают. Таким образом, я решил сгруппировать результат совокупного подсчета в подзапрос ... то есть последнее решение Карвина.
Итак, вот мое обновленное (полностью рабочее) утверждение:
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;