MySQL sorgusu çalışmıyor GİBİ DEĞİL

1 Cevap php

Ben 2 tablolar var:

  • ileti
  • etiketler

Etiketler tablo bu gibi yapılandırılmıştır:

  • Post_id
  • etiket

Yani bir yazı için verdi her etiket için, ben etiketleri tabloda bir kayıt oluşturun. Sonrası 10 etiketleri varsa, o Post_id ile etiketleri tabloda 10 kayıt olacak.

Ben artık kullanıcılar etiketleri verilen anahtar kelimeleri içermeyen mesajlar için bir arama yapabilirsiniz arama sayfası oluşturmaya çalışıyorum. Bu olsa bir sorun oluşturur. Bir sorgu gibi:

SELECT DISTINCT ileti.id, ileti.title, ileti.content
   FROM jobs, etiketler
   WHERE etiketler.etiket NOT LIKE '%$keywords%' AND ileti.id=etiketler.Post_id

sonrası 6 etiketleri var ve bunlardan biri anahtar kelime var ise etiketleri tablodaki diğer 5 kayıtları o anahtar kelime yok çünkü, hala iade edilecektir, çünkü çalışmaz.

Bunu çözmek için en iyi yolu nedir? Tüm virgülle ayrılmış etiketler yalnızca arama için kullanılan depolar ileti tabloda yeni bir sütunu oluşturma dışında herhangi bir yolu?

1 Cevap

Dizinleri ya da bu çok kötü yapacak olduğundan emin olun:

SELECT posts.id, posts.title, posts.content
FROM posts 
WHERE NOT EXISTS (
  SELECT post_id from tags
  WHERE tags.tag LIKE '%$keywords%' 
    AND posts.id=tags.post_id
)

Bu belirlediğiniz etiketi eşleşen bir etiket sahip olanlar hariç, tüm mesajların bir listesini alır. (Sizin resmi sorgusu 'işler' tablosunu başvuruyor. Bunu 'mesaj' için bir yazım hatası olduğunu düşünmüştüm.)

: Table aliases bu biraz temiz hale

SELECT p.id, p.title, p.content
FROM posts p
WHERE NOT EXISTS (
  SELECT t.post_id from tags t
  WHERE t.tag LIKE '%$keywords%' 
    AND p.id=t.post_id
)

Sonra, bu indeksler oluşturmak istiyorum:

Posts: id, tag_id
Tags: post_id, tag

Sonra, iyi performans olmadığını görmek için 'explain' ile sorguyu çalıştırın. Sonuçları ile sorunuzu güncelleyin ve birisi daha tavsiye sunacak. Endeks ayar yüzden test başka bir şey gerçekten gerekli olandan daha fazla deneme ve hatadır.