çok sütunlu bir arama mysql

4 Cevap php

I have a table like this:

+-------------------+---------------+
| description       | colour        |
+-------------------+---------------+
| Macrame Dress     | Washed Black  |
| Darcelle Gilet    | Dirty Shellac |
| Darcelle Cardigan | Washed Black  |
| Let It Rot Vest   | Optic White   |
| Let It Rot Crew   | Washed Black  |
| Let It Rot Crew   | Optic White   |
| Battalion Short   | Somme         |
| Seine Dress       | Washed Black  |
| Seine Dress       | Cocomotion    |
| Odette V-neck     | Linen Marl    |
+-------------------+---------------+
I want search it for "black dress" and it only return rows 1 & 8. If I type in "black", it will return rows 1, 3, 5 & 8. Dress should return rows 1, 8 & 9.

Herkes arama sözcükleri herhangi bir sayı alır ve en özlü sonuç kümesi dönecektir sql gerçekten zarif, güzel bit düşünebilirsiniz. Ben bunu yapmak için bazı çirkin yollar geliyor, ama onlar benim karma üzgün.

4 Cevap

Aklıma sadece nice solüsyonu (karma-bilge) bir FULLTEXT indeksi kullanılarak içerecektir. Bu, böyle sorguları yararlanmak için izin verecek:

SELECT * FROM mytable
WHERE MATCH (description,color) AGAINST ('black dress');

Eğer doğru geri çağırmak yazık ki, FULLTEXT indeksleri, MyISAM tablo türü gerektirir.

EDIT

Bu sizin için ne arıyorsanız olduğundan şüpheliyim ama bana tartışma uğruna bunu ekleyelim. Sen could geçici bir MyISAM tabloya verileri çoğaltmak ve size bu konuda tam metin arama yapın:

CREATE TEMPORARY TABLE mytmptable ENGINE=MyIsam SELECT * FROM mytable;
ALTER TABLE mytmptable ADD FULLTEXT KEY (description,color); 
SELECT * FROM mytmptable WHERE MATCH (description,color) AGAINST ('black dress');

Sizin sütunları nedir veri türü vardır? Onlar VARCHAR veya benzer ise, sadece yaparım

select 
  * 
from 
  tbl 
where 
  description like '%(s1)%' 
  or colour like '%(s1)%'

(Bu benim soruyu yanlış inananlar, @ Pax uyarlanmıştır - ben bu arama terimi 'açıklaması' ya da 'renk' göründüğünde bu maç gerektiği anlamına almak.)

İdeal olarak, iki ayrı arama terimleri, açıklaması (s1) için bir renk ve (s2) için bir tane var diye düşünüyorum.

Sonra sorgu olur:

select * from tbl where description like '%(s1)%' and colour like '%(s2)%'

Tabii s1 ve s2 için değerleri ikame.

Boş s2 şeyi (sanırım) maç hangi%% neden olacaktır.

Her iki alanda birden terimleri arama yapabilmek için, sizin gibi bir şey gerekir

select * from tbl
    where description + colour like '%(s1)%'
      and description + colour like '%(s2)%'
      and description + colour like '%(s3)%'

Bu arama desen kelime sayısının (yani "siyah elbise" s1 ve s2, siyah sadece s1 olacak olacak) dayalı, anında inşa edilmesi gerekir. "Açıklaması + renk" bit Zincirleme alanlar olduğunu; benim SQL yüzden tam olarak bunu nasıl yapardım bilmiyorum biraz paslı ama kavramdır ses.

Peki, sürece sorguyu araya PHP gibi kullanabilirsiniz, bu çalışması gerekir:

SELECT * FROM tbl
WHERE (description LIKE '%black%' OR colour LIKE '%black%')
AND (description LIKE '%dress%' OR colour LIKE '%dress%')

... Eğer arama terimi her sözcük için bu parantez şartlarından birini, ve onları bağlamak "VE" eklemek nerede. Bu arama terimi kelimelerin her biri için sütunların en az birinde bir maç gerektirir.

Saf SQL (gerçek sorgu arama vadede kaç kelime bağlıdır) değil, ama reasonably zarif hissediyor ve ben bu işi yapmak gerektiğini düşünüyorum.