Nasıl tek bir mySQL girişi arasında pek olası desenleri bulabilirim?

2 Cevap php

Ben zor bir zaman sorumu özetliyor vardı. Temelde:

"Dosya" adında bir tablo var. Dosyaları "notları" adlı bir giriş tutar. Bu, bir dosya için yararlı olabilir, özellikle sınıf seviyesini tanımlamak için kullanılır. Bir dosya> 1 sınıf düzeyi için yararlı olabilir, çünkü bu gibi şeyler saklamak

If it's only good for 3rd grade grades: 3

If it's good for 3rd, 4th and 5th: grades: 3,4,5

vs vs

Bu dosyaları almak için bir SQL sorgusu koyarak, ben bir garip sorun-Temelde bir kullanıcı koştu "Ben sadece 2. ve 3. sınıf için iyi olan şeyleri istiyorum" diyebilirsiniz. Yani Sınıflar alanında "2,3" olan dosyalar için bakmak gerekir. Kolay! AMA!

Aynı zamanda "1,2,3" veya "2,3,4" ya da "2,4" olabilir.

Ben; sadece düşünmeye bir baş ağrısı alıyorum. Bu "1" almak ve "2" için virgül üzerinden bu kayıtlar ayrıştırmak için yeterince kolay, ama sorguya SQL rekoru en etkili yolu nedir? Bu, DB HER REKORU olsun onları ayrıştırmak ve daha sonra tekrar onları maç için bir atık gibi görünüyor.

Bu silbaştan gidin ve "dosyalar" ve her sınıf için ayrı ayrı tablolar adında bir DB oluşturmak için daha iyi mi? Bu da bir dosya için bir atık-yazma çoklu kayıtları gibi görünüyor.

Çözüm burada ne var? Ben biraz afallamış değilim.

2 Cevap

Burada çeşitli seçenekler ...

1) Her sınıf bir bite karşılık gelen bir tamsayı olarak notları saklayın. = bit 0 grade 1, grade 2 = Bit 1, vb grade 3 = biraz 2 ve. Daha sonra sınıflarda 1,2,3 (8) ve sınıflarda 2,4 0x00001010 (10) vb olacaktır 0x00000111 tekabül eder; sonra sorgulama AND karşılaştırma yapmanın basit bir mesele haline gelir ... Eğer tüm sınıflarda 2 ve 4 seçilir satırları (ve muhtemelen diğerleri) istiyorsanız o seçin * dosyaları nereye (sınıflar ve 10) == true

Nispeten az sayıda sınıflarda yalnızca varsa 2) Eğer bir boolean sütun olarak her mağaza olabilir.

Birçok ilişki için bir çok olduğundan 3)) (ayrı bir tabloda notları saklamak ve daha sonra sınıflar ve dosyalar 3 na arasındaki ilişki masaya katılmak.

Ne @ EMH üzerinde durmaya söyledi. En iyi seçenek IMHO, dosya kimliği dosyaları masaya bağlanan sınıflarda tabloya sahip olacaktır (# 3). Daha sonra yeni bir satırda, her zaman sınıf ve dosya arasındaki bağlantıyı saklayabilirsiniz (bağlantı zaten yoksa)

tbl_file_grades
-----------
file_id
grade

Eğer arama yapıyoruz, siz iki tabloyu birleştirmek ve sınıf sütuna göre arama filtreleyebilirsiniz.

SELECT files.file_info FROM files
INNER JOIN tbl_file_grades ON files.file_id = tbl_file_grades.file_id
WHERE tbl_file_grades.grade = 1 AND tbl_file_grades.grade = 2 ...

Ben sınıflar için ekstra tablo gerekli olup olmadığından emin değilim. Bu sizin ihtiyaçlarınıza bağlıdır. Daha sonra o olması o kadar önemli değildir, artık onsuz mutlu olursanız gibi görünüyor.

Ve de en önemlisi, SO hoş geldiniz.