SQL-запрос: группировка по текстовому полю - PullRequest
2 голосов
/ 21 декабря 2008

У меня есть запрос ниже, который в основном возвращает 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?

Просто для записи (которую я не считаю очень важной) я использую 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;

Ответы [ 2 ]

5 голосов
/ 22 декабря 2008

Старое расширение PHP "mssql" поддерживает только VARCHAR размером до 255 байт. Это известное ограничение, и именно поэтому 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);
0 голосов
/ 22 декабря 2008

Прежде всего, не используйте bk. *, Используйте полный список столбцов столбцов, которые вам действительно нужны.

Я не могу ответить на вопрос 1, но вот ответ на вопрос 2: вместо выбора и группировки на desc_book вместо этого приведите его так: CAST(desc_book AS NVARCHAR(2000)) AS desc_book (или другой подходящий размер nvarchar).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...