2016-04-04 19 views
-1

Tablodaki 'field_value' tabelasını içeren 'field_value' tablosunu giriş yapmak istiyorum, çünkü birçok sütun özel sütun ismine sahip.Tablo sonuçlarında sorgu sonucu sütunlar nasıl yapılır?

Bir örnekle üzerinde açıklayalım:

+---------------------+ 
|  field_value  | 
+---------------------+ 
|v_value   v_id | 
| Peter    1 | 
| Lagaf    2 | 
| Football   3 | 
| Male    4 | 
| 12345678   5 | 
+---------------------+ 

tablo alanı içerecektir adlı sütunlar

+--------------------+ 
|  field  | 
+--------------------+ 
| f_id  f_label | 
| 1   surname | 
| 2   name | 
| 3   hobbies | 
| 4   sex  | 
| 5   phone | 
+--------------------+ 

Ve gibi olacaktır sonucu: tablo 'FIELD_VALUE' değerleri içerir izleyen:

+---------------------------------------------+ 
|     Result     | 
+---------------------------------------------+ 
| surname name hobbies sex phone | 
| Peter  Lagaf Football Male 12345678 | 
+---------------------------------------------+ 
+0

Futbolun Peterin hobisi olduğunu ve başka birinin olmadığını biliyor muyuz? – Strawberry

+0

Bu tasarım türü, EAV (varlık-öznitelik değeri) olarak adlandırılır ve sağladığınız örnek veriler kötü bir seçimdir, 'f_label' değerleri satır değil sütunlar olmalıdır. –

+0

Bunun anlamlı olmasının tek yolu, her bir f_id için sadece 1 değeriniz varsa ve eğer durum buysa, verilerinizi sizin yaptığınız gibi depolamak mantıklı değildir. – sagi

cevap

0

Veritabanınız normalleştirilmemiş - ve Normalleştirilmiş şemanın neye benzediğini bilmeden kesin bir cevap vermek imkansızdır. Ayrıca, şemanız birden fazla kayıt tutmak için geçersiz. Sorunuzla ilgili en önemli konular, bir kayıt oluşturan alan değerleri kümesini gruplandırmak için hiçbir şey olmamasıdır, her kayıt için benzersiz bir tanımlayıcı olarak düşünülemez ve her bir "kayıt" da bir field_value tablosundaki nitelikler kümesi. Veritabanında kayıttan daha fazlasının olduğu durumu düşünün - 12345678 numaralı telefonun, Peter adına değil, Peter ile ilişkili olduğunu bilmemiz gerekir.

(statik veri açısından) basit çözüm sonra saha tabloya kayıt tanımlayıcı için bir öznitelik eklemektir: Yanıtınız için

SELECT record.value, surname.value, name.value, hobbies.value.... 
FROM field AS record 
INNER JOIN field AS surname 
    ON record.record_id=surname.record_id 
    AND surname.f_id=1 
INNER JOIN field AS name 
    ON record.record_id=name.record_id 
    AND name.f_id=2 
INNER JOIN field AS hobbies 
    ON record.record_id=hobbies.record_id 
    AND hobbies.f_id=3 
... 
WHERE record.f_id=0 
    ON record.record_id=name.record_id 
0

Teşekkür symcbean.

bu gerçek tabloları ve gerçek sonucudur, yazı basitleştirmek istedi: Ben collect_id = 2 sahip siparişler öğeyi görüntülemek istediğiniz Ve her order_item ile ilgili tüm alanlarını görüntülemek istiyorum.

+-------------------------------+ 
|   order_item   | 
+-------------------------------+ 
| oi_id oi_price oi_collect_id | 
| 1   100   2  | 
| 2   30   2  | 
| 3   55   3  | 
| 4   70   4  | 
| 5   220   2  | 
| 6   300   4  | 
+-------------------------------+ 

+-----------------------------------+ 
|   field_value   | 
+-----------------------------------+ 
| v_value v_fk_field_id oi_fk_id | 
| Peter    1  1  | 
| Lagaf    2  1  | 
| Football   3  1  | 
| Male    4  1  | 
| 12345678   5  1  | 
| Frank    1  2  | 
| Loran    2  2  | 
| Tennis   3  2  | 
| Male    4  2  | 
| 11223658   5  2  | 
| Nathali   1  3  | 
| Waton    2  3  | 
| Reading   3  3  | 
+-----------------------------------+ 

oi_fk_id : foreign key ref(order_item.oi_id) 
v_fk_field_id : foreign key ref(field.f_id) 

+--------------------+ 
|  field  | 
+--------------------+ 
| f_id  f_label | 
| 1   surname | 
| 2   name | 
| 3   hobbies | 
| 4   sex  | 
| 5   phone | 
+--------------------+ 

+-----------------------------------------------------------------------------+ 
|         Result         | 
+-----------------------------------------------------------------------------+ 
| oi_id oi_price oi_collect_id surname name hobbies sex phone | 
| 1   100   2  Peter  Lagaf Football Male 12345678 | 
| 2   30   2  Frank  Loran Tennis Male 11223658 | 
| 5   220   2  Nathali Waton Reading null null | 
+-----------------------------------------------------------------------------+ 

Önemli: tablo alanı sadece bu 5 alanları (adı, soyadı, hobiler, cinsiyet, telefon) içermez, ancak developper yazışma için, aynı şeyi bilmiyor olabilir ki diğerleri içerebilir tablodaki değer 'field_value'

İlgili konular