&Quot MySQL sorgu;kavşak" sınırlar ile çok sayıda sorgu
Varsayalım aşağıdaki alanları ile tek bir mySQL tablo (kullanıcı) var:
userid
gender
region
age
ethnicity
income
Toplam kayıt bir kullanıcı girer sayısına göre sayısını döndürmek için mümkün olmak istiyorum. Ayrıca, ek kriterler sağlarsınız.
600 kayıtları cinsiyete sahip olduğu en basit örnekte, 1.000 kayıtları isteyebilir = 'Erkek' ve 400 kayıtları cinsiyet = 'Kadın'. Bunu yapmak için yeteri kadar basit.
Şimdi, bir adım daha ileri gitmek. Varsayalım onlar şimdi Bölge belirtmek istiyorum:
GENDER
Male: 600 records
Female: 400 records
REGION
North: 100 records
South: 200 records
East: 300 records
West: 400 records
Yine, sadece 1000 kayıt iade edilmelidir, ama sonunda, 600 erkek, 400 kadın, 100 Kuzeyliler, Güneyliler 200, 300 ve 400 Doğulular Batılılar olmalı.
Bu geçerli sözdizimi olmadığını biliyorum, ama sözde mySQL kodunu kullanarak, yapmak istediklerimi umarım gösterir:
(SELECT * FROM users WHERE gender = 'Male' LIMIT 600
UNION
SELECT * FROM users WHERE gender = 'Female' LIMIT 400)
INTERSECT
(SELECT * FROM users WHERE region = 'North' LIMIT 100
UNION
SELECT * FROM users WHERE region = 'South' LIMIT 200
UNION
SELECT * FROM users WHERE region = 'East' LIMIT 300
UNION
SELECT * FROM users WHERE region = 'West' LIMIT 400)
Tek seferlik bir sorgu arıyorum unutmayın. Kayıtlar ve her ölçüt içinde kayıt sayısı sayısı sürekli kullanıcı tarafından girdiye dayalı değişecektir. Bu yüzden, yeniden tekrar tekrar, kodlanmış bir çözüm değil, genel bir çözüm ile gelip çalışıyorum.
İşleri daha karmaşık hale getirmek için, artık daha fazla ölçüt eklemek. Ayrıca her grup, ek kod yukarıda eklenen kayıtları kendi belirledikleri sayıda her yaş, etnik köken ve gelir olabilir
INTERSECT
(SELECT * FROM users WHERE age >= 18 and age <= 24 LIMIT 300
UNION
SELECT * FROM users WHERE age >= 25 and age <= 36 LIMIT 200
UNION
SELECT * FROM users WHERE age >= 37 and age <= 54 LIMIT 200
UNION
SELECT * FROM users WHERE age >= 55 LIMIT 300)
INTERSECT
etc.
Eğer bu bir sorgu yazmak mümkün olup olmadığını ya da eğer bu birden fazla tablolar ve yineleme gerektirir emin değilim.
CEVAP
Kriterlerinize Düzleştirin
Tek bir seviye kriterleri içine çok boyutlu kriterlerinize dümdüz
Şimdi bu kriterleri aşağıdaki gibi bir sorgu elde edilebilir
(SELECT * FROM users WHERE gender = 'Male' AND region = 'North' LIMIT 40) UNION ALL
(SELECT * FROM users WHERE gender = 'Male' AND region = 'South' LIMIT 80) UNION ALL
(SELECT * FROM users WHERE gender = 'Male' AND region = 'East' LIMIT 120) UNION ALL
(SELECT * FROM users WHERE gender = 'Male' AND region = 'West' LIMIT 160) UNION ALL
(SELECT * FROM users WHERE gender = 'Female' AND region = 'North' LIMIT 60) UNION ALL
(SELECT * FROM users WHERE gender = 'Female' AND region = 'South' LIMIT 120) UNION ALL
(SELECT * FROM users WHERE gender = 'Female' AND region = 'East' LIMIT 180) UNION ALL
(SELECT * FROM users WHERE gender = 'Female' AND region = 'West' LIMIT 240)
Sorun
- Her zaman doğru sonucu döndürmez. Eğer kuzeyden olan erkek 40 daha az kullanıcı varsa, örneğin, daha sonra sorgu 1000'den daha az kayıtları döndürür.
Ölçütlerinizi Ayarlayın
İzin ve kuzeyden olan erkek az 40 kullanıcılar olduğunu söylüyorlar. Sonra, diğer kriterleri ayarlamak gerekir eksik miktarı karşılamak için miktar "" ve"". Kuzey Erkek itibaren Olası çıplak SQL ile ilgisi olmadığı kanaatindeyim. Bu aklımdaki pseudo kodu. Basitleştirme uğruna, sadece Erkek, Kadın, Kuzey ve Güney için sorgu olacağız sanırım
conditions.add({ gender: 'Male', region: 'North', limit: 40 })
conditions.add({ gender: 'Male', region: 'South', limit: 80 })
conditions.add({ gender: 'Female', region: 'North', limit: 60 })
conditions.add({ gender: 'Female', region: 'South', limit: 120 })
foreach(conditions as condition) {
temp = getResultFromDatabaseByCondition(condition)
conditions.remove(condition)
// there is not enough result for this condition,
// increase other condition quantity
if (temp.length < condition.limit) {
adjust(...);
}
}
İzin sadece 30 northener erkek olduğunu söylüyorlar. 10 erkek ve 10 northener ayarlamamız lazım.
To Adjust
---------------------------------------------------
Male 10
North 10
Remain Conditions
----------------------------------------------------
{ gender: 'Male', region: 'South', limit: 80 }
{ gender: 'Female', region: 'North', limit: 60 }
{ gender: 'Female', region: 'South', limit: 120 }
'Erkek 'Güney' maçın ilk koşulu 'Erkek' uyum durumu.' 10, ve "durum" liste kalır. çıkarmak artış Güney artırmak beri, diğer koşullarda azaltmak için ihtiyacımız var. """Listesi . Ayarlamak İçin" durum Güney eklemek
To Adjust
---------------------------------------------------
South -10
North 10
Remain Conditions
----------------------------------------------------
{ gender: 'Female', region: 'North', limit: 60 }
{ gender: 'Female', region: 'South', limit: 120 }
Final Conditions
----------------------------------------------------
{ gender: 'Male', region: 'South', limit: 90 }
Maç bu duruma 'Güney' ve aynı işlemi tekrarlayın.
To Adjust
---------------------------------------------------
Female 10
North 10
Remain Conditions
----------------------------------------------------
{ gender: 'Female', region: 'North', limit: 60 }
Final Conditions
----------------------------------------------------
{ gender: 'Female', region: 'South', limit: 110 }
{ gender: 'Male', region: 'South', limit: 90 }
Ve son olarak
{ gender: 'Female', region: 'North', limit: 70 }
{ gender: 'Female', region: 'South', limit: 110 }
{ gender: 'Male', region: 'South', limit: 90 }
Ayar tam olarak uygulanması henüz almadım. Umduğumdan daha zor. Bunu nasıl çözebilirim bir kez güncellenir.
MySQL "" sorgu...
Mongodb ile sorgu nasıl "gibi&quo...
Nasıl bir "" değil; SERİ ile ...
Nasıl " için SQL Server bir işlevi...
&; sorgu Select2 tanımsız hata" iç...