Bilgi için MySQL arama birden fazla tablo

5 Cevap php

Ben bir kullanıcı sağlanan anahtar kelimeleri ile arama farklı kitaplık seçebileceğiniz bir searchfunctionallity inşa ediyorum. Ayrıca AND operatörü desteklenmektedir. Benim sorunum ben bilgi aramak için çalıştığınızda bu şekilde çarpılır alır ya da üstel artış olur ki?

Ben sonuçları işlemek için bir MySQL veritabanı ve PHP kullanıyorum.

Bir örnek sorgu, bu, okunabilirliği için alınan numune tablenames gibi görünüyor:

SELECT table1.id AS table1_id,
       table2.id AS table2_id,
       table1.*,
       table2.*
FROM   table1, table2
WHERE  (table1.column1 LIKE '%key%' OR table1.column2 LIKE '%key%') OR
       (table2.column1 LIKE '%key%' OR table2.column2 LIKE '%key%')

Bir kullanıcı 'anahtar VE yek' gibi anahtar kelimeler sağlar Ya da sorgular gibi görünecektir:

SELECT table1.id AS table1_id,
       table2.id AS table2_id,
       table1.*,
       table2.*
FROM   table1, table2
WHERE  ( (table1.column1 LIKE '%key%' AND table1.column2 LIKE '%key%') OR
        (table1.colum1 LIKE '%yek%' AND table1.colum2 LIKE '%yek%') ) 
OR
       (( table2.column1 LIKE '%key%' AND table2.column2 LIKE '%key%') OR
        (table2.colum1 LIKE '%yek%' AND table2.colum2 LIKE '%yek%') )

Ben civarı arandı ve BİRLİĞİ genelinde geldi, ama bu hile yapmayacağım ettik. Öncelikle çünkü sorgulama ediyorum tabloların eşit değildir ve bu oldukça pahalı bir sorgu. Bu yüzden de searchfunctionallity kullanılacaktır, çünkü çoğu zaman bu bir seçenek değil.

Aslında ben 2 veya 4 sütunlar arasında 5 tablo ve masa başına sorgulama ediyorum. Ben bu yüzden sonucu 1 satır almalısınız ama aslında ben çok daha fazla alıyorum eşsiz bir değere sahip tablolardan birinde bir testrow kurmak. Tüm 5 tablo seçtiğinizde ben 10K üzerinde resultrows alıyorum. Yani benim tahminim sonucu bir yol veya başka çarpılır alır olduğunu. Ben operatörleri AND ve OR ancak bugüne kadar herhangi bir şans olmadan oynadım.

Bir webapp, kullanıcı dostu bir Arama motoru kurmak benim 'arayış' de bana yardımcı olabilecek birisi var mı?

5 Cevap

Benim durum için 'ağır' için tam metin çözümleri bulundu. Ben masanın başına sorguları saklanır ve daha sonra ben istediğim veri görüntülemek için onları kullandım bir sorgu-dizi oluşturduk. Onların çaba için Herkes teşekkürler!

Gerçek bir tam metin arama motoru bakmak gerektiğini, birçok çevrede var:

  • lucene
  • sphinx
  • Mysql: MySQL tam metin arama motoru var ama bu tür hızlı bir çözüm istiyorsanız bu yüzden ayrı kullanmak tavsiye yok yavaşlatacak
  • couchDB: Bu gerçekten bir tam metin arama motoru değil ama senin durumunda bu olabilir yardımcı olur ama şu anki MySQL veritabanı bir DB oluşturmak mümkün ve kullanımı yönünde sadece arama amaçlı.

tablo nasıl yapılır bağlı olarak, size ihtiyacınız olan tüm bilgileri içeren bir tablo oluşturmak isteyebilirsiniz.

A 'çarpma' olarak görünen senin kümesi sorunu çözecektir katılın.

http://en.wikipedia.org/wiki/Join%5F%28SQL%29

Bu da Table2 bulunan ve yabancı anahtar olarak kullanılacak olması Table1 bir alanı gerektirir.

Örneğin için, Tablo 1 ve Tablo 2 hem ProductID var:

Tablo1 Sol Dış Table1.ProductID = Table2.ProductID üzerinde Table2 tarihi itibaren * Seçiniz

Bazı öneriler:

  1. Ben kullanarak öneririm (INNER?) Tablo1, tablo2 DAN yerine SELECT JOIN. Bu tablo sayısını daraltmak olacaktır. Bu, çıktı ölçüde sınırlamak gerekir.
  2. DISTINCT anahtar kelime (veya GROUP BY gibi paralellikler) içine bakmak, daha da çıkışını sınırlamak gerekir
  3. DON'T rule out UNION. I don't know about MySQL, but in Oracle's SQL it is often two to three times faster than using an "OR". If you have -- Admittedly, this query is a bit defective, but I'm trying to demonstrate. SELECT table1.data FROM table1, table2 WHERE table1.data = 7 UNION SELECT table1.data FROM table1, table2 WHERE table1.data = 8; that will be far faster than using: SELECT table1.data, table2.* FROM table1, table2 WHERE table1.data = 7 OR table1.data = 8;

Genel olarak, ben böyle bir şey (bu Oracle sözdizimi) kullanarak daha iyi sonuçlar göreceksiniz düşünüyorum:

SELECT 
    ti.id, 
    t1.data,
    t2.*
FROM 
    table1 t1
    JOIN
       table2 t2
       ON(
          t1.id = t2.id
       )
WHERE 
    table1.data LIKE '%foo%'
UNION 
    SELECT
       ti.id, 
       t1.data,
       t2.*
    FROM 
        table1 t1
        JOIN
           table2 t2
           ON(
              t1.id = t2.id
           )
    WHERE 
        table1.data LIKE '%bar%';

------- EDIT -------
It has been protested that "JOIN will not work as the tables are completely different". So long as there exists some key which exists that can relate one of the tables to another, JOIN will be able to create (effectively) an "uber-table" which has access to all of the data of both tables. If this index does not exist, then you'll probably need some system to concatenate the information outside of the SQL query.

Ben ne istiyorum farklı SEÇ sorguları sonucu birleştirebilirsiniz UNION kullanmak olduğunu düşünüyorum.

(SELECT id FROM table1 WHERE  (table1.column1 LIKE '%key%' OR table1.column2 LIKE '%key%'))
UNION 
(SELECT id FROM table2 WHERE  (table2.column1 LIKE '%key%' OR table2.column2 LIKE '%key%'))