2011-01-24 14 views
8

Bir oyunda kullanıcıların hareketlerini kaydeden bir veritabanı tablosu var. Her hareket ettiğinde, kullanıcı kimliklerini, move_index (her satırı artırır) ve bulundukları bölgenin kimliğini kaydeder. Bu kullanıcının son hareketini göstermek için -1 özel bir move_index değerine sahibim.seçmek için bir seç seçenekten bir sonuç

id user_id move_index zone_id 
---------------------------------------------------------------- 
0 11  0   0 
1 11  1   0 
2 11  2   0 
3 11  -1   3  

4 22  0   0 
5 22  1   1 
6 22  2   1  
7 22  -1   3  

ben sql ile iki şey yapmak istiyorum:

  • başladı ve genişletme
  • (örneğin 3 bölge 0 başlamış ve bölgede bitmiş) belirli bölgelerde bitmiş tüm kullanıcıları Algılama yukarıda, belirli bölgelerde başlayan ve biten tüm kullanıcıları tespit edin VE belirli bir bölgeden geçmiş.

Birden çok SQL deyimi & java ile bunu nasıl yapacağımı biliyorum - ancak bunu tek bir SQL deyiminde nasıl yapacağımı bilmiyorum. Bu seçimin sonuçlarında seçim yapmak ve sonra bir seçim yapmak zorunda mıyım?

cevap

10

Sadece bir "tek" sorgu içinde bunu başarmak için bir SUBQUERY gerçekleştirebilir.

ör .: Özünde SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

, siz "iç" için belirlenen çalışma verileri "dış" SEÇ SEÇ olarak sonuçlarını kullanıyoruz.

SELECT *, (foo = true AND bar = true) as foobar 
FROM foo 
WHERE (id = 3) 

İkinci denklemin sonucunu belirlemek için sorgu sonucu filanca değerini kullanabilirsiniz:

+0

Teşekkürler - Buradan anladım. Bu standart SQL mi (yani Oracle üzerinde de çalışır mı?). Ve, performans sorunları, yapabileceğiniz SUBQUERIES sayısı üzerinde herhangi bir sınır var mı? – Kevin

+0

@Kevin Altkümeler hemen hemen her RDBMS'dedir (hangi standardın bir parçası olduklarından emin değiller). Sınırlar açısından, verilerinizin büyüklüğü/şekline bağlı olarak değişir, ancak genellikle Mümkünse tek bir alt sorgudan daha fazlasını kullanın. (Çoğu durumda bir düz [JOIN] (http://dev.mysql.com/doc/refman/5.0/en/join.html) veya bazen bir [CASE] (http://dev.mysql.com/ doc/refman/5.0/tr/case-statement.html) veya geçici bir tablo daha uygun olabilir.) –

+0

Çok açık ve kullanışlı bir yanıt. Bana çok iş kurtardığın için teşekkürler. – maartenmachiels

0
select distinct user_id from table where (move_index=0 and zone_id=0) and (move_index=-1 and zone_id=3) 
0

burada sorgu gider.

Sanırım, bunun nasıl yapılacağına dair bir ipucu vermelisiniz.

İlgili konular