I verilen yapıda nasıl ağaç geçişi yapmalıdır?

3 Cevap php

Mission

Ben aşağıda gösterildiği tablolar kümesi çocukların sayısını bulmaya çalışıyorum. Çevre LAMP ama diğer sözdizimlerinden aracılığıyla doğru yönde yardım takdir edilmektedir.

Table structure

users
-----
user_id  
pvardırnt_id


user_meta
---------
user_id
registration_date


user_levels
-----------
user_id
level

Bu temel yapısını değiştirmek mümkün değildir ancak uzatılabilir.

Use case

select
  users.user_id
from
  users
inner join
  user_meta
  on users.user_id = user_meta.user_id
inner join
  user_levels
  on users.user_id = user_levels.user_id
where
  pvardırnt_id = *x*
  ve
  registration_date > *certain date*
  ve
  level < *certain level*

Conditions

  • Bir kullanıcının soyundan yalnızca düzeyi verilen düşükse gibi sayar *certain level*. Soyundan seviyesi düşük değilse, düğüm bir yaprak ama saymak dışında tutulmalıdır.
  • *certain level* verildi ve *certain date* sorgularının set her sorgu / için aynıdır.

Ben bir döngü bu kullanarak denedim ama sorgularının miktarı hızla Escalades. Bu çözüm, muhtemelen kullanılan ve depolanan bir cron işi ama ben bir olarak gerçek zamanlı olarak-it-gets-çözümü tercih ederim olabilir.

(Not: Bu benim ilk soru bu yana, düzenlemek için çekinmeyin ve daha iyi sorular sormak konusunda ipuçları vermek)

3 Cevap

Geçerli veri modeli ile ardışık veritabanı sorgulama daha bunu yapmak için daha etkili bir yolu yoktur. Eğer veriler (aynı zamanda iç içe set model olarak anılacaktır) Modifiye Preorder Ağacı Traversal'i kullanabilirsiniz daha fazla bilgi içerecek şekilde saklanan biçimini değiştirmek mümkün ise. Bu model MySQL website üzerine bir makalede tartışılmaktadır. Bu sitede birçok örnek sadece "Modifiye Ön sipariş Ağacı Geçişi" için arama da vardır.

Bu yerel belleğe kullanıcının tüm kayıtları çekin ve sahip kaç kullanıcı bağlı olarak, orada yerine bir algoritma çalıştırmak için daha hızlı olabilir. SQL gerçekten özyinelemeli ağaç geçişi için uygun değildir.

Bir SQL99 özellik cadı var wich recurcive işlevler oluşturmak ve etkin bir ilişkisel veritabanında saklanan hiyerarşik veri işlemek için izin "Common Table Expression" denir.

It looks like MySql does not (yet) implement it but you could see what can be done with this : http://msdn.microsoft.com/en-us/library/ms190766.aspx