"" Ihmal Nasıl

3 Cevap php

Ben bir proje için bir "alfabetik ARAMA" modülü yapıyorum.

o benziyor olacaktır

A B C D E F . . . . . . . . . .. . . . . . . .. . . . Z

I tıkladığınızda "A" sonuçlar "A" sırala olmalıdır. Hangi tüm alfabeler için aynıdır.

Aşağıdaki gibi Şimdi benim prob:

  • Örneğin "The Mummy" adında bir film var.

  • Ne yapmam tıklama "ALPHABET T" Bu gelen filmi tür olacak durumdur.

  • Ama benim müşteri ihtiyaç olduğunu "The Mummy" movie must sort when the user clicks on "M" and not "T"

  • "a, an, the" "MAKALELER" ve herhangi bir anlamı yoktur çünkü.

Herkesin benim sorunum ne olduğunu anlamış ki şimdi umut ....

Herhangi bir yardım kayda değer ve müteşekkir olacaktır.

şimdiden teşekkürler

3 Cevap

Assuming that you do not wish to modify the content of the table (and hence get slightly less efficient queries), the following should do the trick.
(If you do have the leisure of modifying the table, see the suggestions at the end of this answer)

SELECT Title
FROM myTable
WHERE (Title LIKE 'x%' OR Title LIKE 'THE x%')
  -- AND Title NOT LIKE 'THE [^T]%'   
ORDER BY Title

Notes:
- x designate the desired letter (example: LIKE 'A%' etc.)
- The "AND TITLE NOT LIKE" extra condition is only needed when "X" is the letter "T" (it is otherwise functionally redundant, but doesn't change the result)
- I'm unsure of the support of the the [^xyz] (i.e. NOT characters x, y or z), so the [^T] could be replaced by its positive equivalent say [A-RS-Z0-9].

Orada ("OF" "A", "AN", ...) dikkate diğer birkaç durak kelime vardır ama kitap veya film başlıkları için, bu "" düşünün sadece yaygın bir uygulamadır. Eğer diğer makaleleri ile anlaşma gerekiyorsa, mantık olarak uzatılabilir:

SELECT Title
FROM myTable
WHERE (Title LIKE 'x%' 
    OR Title LIKE 'THE x%' 
    OR Title LIKE 'A x%' 
    OR Title LIKE 'AN x%') 
 -- the following is only needed when "x" is either the letter T or A.
 -- AND (Title NOT LIKE 'THE [^T]%' 
 --      AND Title NOT LIKE 'A [^A]%' 
 --      AND Title NOT LIKE 'AN [^A]%'
 --  )
ORDER BY Title



Daha iyi çözümler vardır, if you can modify the table's contents . Bunlardan bazıları ön-hesaplanması birini veya birkaç fazladan sütunlar (ve / bu, yeni kayıtları vb eklendiğinde korumak) anlamına.

  • Örneğin ekstra sütun herhangi istenmeyen gelen gürültü-kelimenin elimden başlığını içeren "sort_column" yaklaşımı, bu yazı Cletus'un 'cevaba bakınız. OP ilk harfi arama sorunu filtreleme alanı olarak amacına ek olarak, bu sütunu da bir daha samimi / mantıklı bir şekilde sıralamak için kullanılabilir, ilk mektuba ilgisiz bir filtre tarafından üretilen başlıkları listeleri ve / veya başlık (her yıl bir arama demek) bir başlangıcı.
  • Yukarıda bir varyasyonu sadece küçük bir sütun için yapım, "etkili" ilk harfini (istenmeyen gürültü geçmiş bir) saklamak için, ama az çok yönlü bir de.
  • Başlığı sütun kendisi yabancı önde gelen gürültü-kelime (ler) parantez, dizenin sonuna taşınır sayede başlık, değiştirilmiş bir formu saklamak, güncellenebilir. Bu uygulama bibliyografik-tipi katalogları ile oldukça yaygındır.

Ne gerçekten burada soruyorsun "stop sözcükleri" kaldırmak için nasıl ("" sadece bir örnek, siz, "a", "yorum" vb kaldırmak isteyecektir). Sert-kod stop sözcükleri kümesi çalışılıyor popo BÜYÜK ağrı, ve korpus değiştirir gibi, sen kodunu değiştirmek gerekecek.

Bunun yerine, sen dur kelimeler korpus dayalı anlamanıza bir algoritma kullanmaya çalışmalısınız. Bir şey bu tür yapmak için Algoritma iyi bilinen ve arama motorları tarafından istihdam edilmektedir. Çok iyi çalışan bir {[(0)] olarak adlandırılır}

Temelde nasıl bu sıralama için ekstra bir sütun olması. Bir name sütun ile bir movie tablo varsa, adında başka bir sütun sort_name ekleyin. Yani (örneğin, "", "a") kaldırıldı önden görmezden istediğiniz herhangi bir kelime ile küçük harflerle film başlığı içermelidir.

Denemek ve dinamik bunu yapmayın.

Alanı güncellenerek zaman da sort_name sütunu güncelleştirmek gerekir. Siz herhangi bir zamanda yeniden olabilir ve tabii endeksine sahip olacak. Sonra sadece yapın:

SELECT *
FROM movies
WHERE sort_name LIKE 'a%'