SQL sorgu: Bir nmetin alanına göre gruplandırma

2 Cevap php

Ben temelde satılan 5 en çok kitap alır altında sorgu var:

    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

Sorun bu hatayı alıyorum ki:

The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

books_book tabloda, alan desc_book türünde ntext biridir, ve ben sorun geliyor emin değilim.

Ben desc_book değişti önce ntext, bu tip nvarchar oldu ve o amele mükemmel olmasıdır.

Ben kitap açıklama (farklı sp) görüntülerken zaman nasılsa PHP web sitesinde, açıklamasına yaklaşık 200-255 karakter olarak kesildi ediliyordu çünkü bu alanın veri türünü değişti nedeni, böylece ben ([{bunu değiştirdi 0)]} ve (yani, bütün desc_book sonunda görüntülenen ediliyordu) 'benim sorun çözüldü'.

Yani temelde bu benim sorular şunlardır:

  1. Why is the desc_book (nvarchar) bir PHP sayfası görüntülenirken alan kesilmiş?
  2. How can i fix the SQL query to accommodate for grouping by an ntext alan?

Kayıt (sanmıyorum çok alakalı) Sadece, ben kullanıyorum MS SQL Server 2005

[UPDATE]

Ben denenmiş ve test edilmiş Bill Karwin 'nin önerilen çözümlerin hem ikisi de mükemmel çalışır. Ben bu nedenle ... Bir alt sorgu içine sayısı toplam sonucunu gruplama yani en Karwin en son çözüm verdi.

Yani burada benim güncellenen (tam çalışma) ifadedir:

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 Cevap

Eski PHP "mssql" uzantısı sadece boyutu 255 bayt kadar VARCHAR destekler. Bu bilinen bir sınırlamadır ve Microsoft SQL Server, modern bültenleri desteklemek için yeni bir PHP uzantısı gelişmekte olan neden bu kadar.

Bir geçici çözüm nvarchar olarak bu sütunun depolama ilan etmek, ancak PHP onu sorgularken, NTEXT dönüştürmek için CAST kullanın. Daha sonra, tam uzunlukta iade edilebilir.

Başka bir seçenek, bir alt sorgunun içine sayılmasını koyarak sadece book_id BY NTEXT, ama GROUP olarak depolanan sütun tutmaktır:

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

Her şeyden önce, bk kullanmayın. *, Aslında ihtiyacınız sütun sütun tam listesini kullanın.

Ben soruya 1 cevap veremez, ama burada 2 soruya bir cevap var: yerine seçeneğini seçin ve desc_book yerine bu gibi döküm gruplama: CAST(desc_book AS NVARCHAR(2000)) AS desc_book (ya da diğer uygun büyüklükte nvarchar).