SORU
26 Kasım 2014, ÇARŞAMBA


&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
11 Aralık 2014, PERŞEMBE


Kriterlerinize Düzleştirin


Tek bir seviye kriterleri içine çok boyutlu kriterlerinize dümdüz

enter image description here

Ş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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Mr. H

    Mr. H

    1 Temmuz 2012
  • Philip DeFranco

    Philip DeFra

    16 EYLÜL 2006
  • Vintendo Power

    Vintendo Pow

    2 Ocak 2007