2016-03-31 13 views
0

Basit bir reçete veritabanına sahibim, bunun için bir reçete yazacak bir sorgu yazmaya çalışıyorum. ilişkili maddeler ve adımlar. Tarifin kendisi, bileşenlerle (bileşen girdilerinin yeniden kullanımını teşvik etmek için) çoktan çoğa ilişkisine ve adımlarla bire çok ilişkisi vardır (şanslar, bir tarifin diğerine özdeş bir adımı yoktur, bu yüzden gerek yoktur) Yeniden kullanım için burada).SQLite - Çoktan-Çokya ve Bire Çok Sayıda JOIN'lerle Seçim

veritabanı kurulumu böylece gibidir:

_ID İÇ (yinelenen verilerin bir ton oluşturur) tüm masalarda KATILDI kullanarak ben belirli bir tarifi için tüm bilgileri çekmek mümkün değilim
CREATE TABLE Recipe (
    _id INTEGER PRIMARY KEY, 
    recipe_name TEXT UNIQUE NOT NULL 
); 

CREATE TABLE Ingredient (
    _id INTEGER PRIMARY KEY, 
    ingredient TEXT UNIQUE NOT NULL 
); 

CREATE TABLE RecipeIngredient (
    _id INTEGER PRIMARY KEY, 
    recipe_id INTEGER, 
    ingredient_id INTEGER, 
    amount REAL, 
    FOREIGN KEY (recipe_id) REFERENCES Recipe(_id), 
    FOREIGN KEY (ingredient_id) REFERENCES Ingredient(_id) 
); 

CREATE TABLE Step (
    _id INTEGER PRIMARY KEY, 
    instruction TEXT NOT NULL, 
    number INTEGER NOT NULL, 
    recipe_id INTEGER, 
    FOREIGN KEY (recipe_id) REFERENCES Recipe(_id) 
); 

, ama nerede takılıyorum, verileri anlamlı bir nesne elde etmek için sonuçların ek ayrıştırılmasını gerektirmeden yararlı hale getirmek için bunu nasıl gruplayabilirim/sipariş verebilirim? Bu 2 sorguda (malzemeler için ve bir adım için bir tane) yapmak daha iyi olur mu? Eğer bu düşünüyorsanız

|| recipe || || ingredient|| ||step|| ||step number|| 
"Recipe One" "Ingredient 1" "Step 1"   "1" 
"Recipe One" "Ingredient 1" "Step 2"   "2" 
"Recipe One" "Ingredient 1" "Step 3"   "3" 
"Recipe One" "Ingredient 2" "Step 1"   "1" 
"Recipe One" "Ingredient 2" "Step 2"   "2" 
"Recipe One" "Ingredient 2" "Step 3"   "3" 
"Recipe One" "Ingredient 3" "Step 1"   "1" 
"Recipe One" "Ingredient 3" "Step 2"   "2" 
"Recipe One" "Ingredient 3" "Step 3"   "3" 
+0

Bize bazı veriler ve istediğiniz sonucu gösterin. Ayrıca bize "ORNER JOIN" öğenizi "yinelenen veriler" ile birlikte gösterir ve bunu düzeltebiliriz. SqlFiddle.com üzerinde çalışan bir örnek oluşturabilirsiniz. Db şemasını yüklemek için 'DDL' metnini kullanın –

+0

@JuanCarlosOropeza daha fazla bilgi ekledi, ancak Thorsten'in cevabını değerlendirerek bunu iki sorguya ayırmaktan daha iyi olacağımı düşünüyorum. –

cevap

2

:

GÜNCELLEME

(madde/adım sayısına göre sıralanır) İÇ tablolar arasında JOIN yapıyor, bir reçete numarası seçmekten geri geliyor bazı örnek veri ekleme aracılığıyla, tüm bunları bir sorguya yerleştirmenin bir anlam taşımadığını fark edeceksiniz. Ne sonuç beklerdin? Adım 1: Fırını ısıtın ve malzemeler şeker, un ve süt. Adım 2: Şeker ve unu karıştırın ve malzemeler şeker, un ve süt. Adım 3: Süt ekleyin ve malzemeler şeker, un ve süt ...

Asıl istediğiniz şey, bileşenlerin bir listesi (sorgu 1) ve atılacak adımlar (sorgu 2).

Bu sorguların sizin için sorun olmadığını varsayalım, bunları birleştirip birleştirmeyeceğiniz ve nasıl birleştireceğiniz konusunda kafanız karışmıştı. Cevap basit: Yapma.

Daha fazla yardıma ihtiyacınız varsa, anlat bana.

+0

Haklısınız, 'Adımlar 'bileşenlerle hiçbir ilişkisi yoktur. Eğer adım 1 '' Madde A ve B 'kullanmak gibi bir şeye ihtiyacınız varsa, ancak farklı bir durum olurdu. –

+0

Düşünüyordum da bu, ama birkaç yıl içinde herhangi bir SQL ile çalışmadım ve kesinlikle paslı, bu yüzden ben sormak istemedim incinme. Hızlı cevap için teşekkürler! –