2011-01-24 40 views
8

Tôi có bảng cơ sở dữ liệu ghi lại chuyển động của người dùng trong trò chơi. Mỗi lần họ di chuyển, tôi ghi lại id người dùng của họ, move_index (gia tăng mỗi hàng) và id của vùng họ đang ở. Tôi có giá trị move_index đặc biệt là -1 để chỉ ra chuyển động cuối cùng của người dùng đó.chọn trên kết quả của một lựa chọn

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  

Tôi muốn làm hai việc với sql:

  • Phát hiện tất cả những người dùng bắt đầu và kết thúc ở khu cụ thể (ví dụ như bắt đầu trong vùng 0 và kết thúc ở khu vực 3)
  • Mở rộng ở trên, phát hiện tất cả người dùng đã bắt đầu và kết thúc ở các khu vực cụ thể VÀ đi qua một khu vực cụ thể.

Tôi biết cách thực hiện điều này với nhiều câu lệnh SQL & java - nhưng tôi không biết cách thực hiện điều này trong một câu lệnh SQL đơn. Tôi có cần phải chọn và sau đó chọn kết quả của lựa chọn này không?

Trả lời

10

Bạn chỉ cần thực hiện SUBQUERY để đạt được điều này trong truy vấn "đơn".

ví dụ .: SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

Về bản chất, bạn đang sử dụng kết quả của cuộc "nội" chọn như là dữ liệu làm việc đặt ra cho "bên ngoài" SELECT.

+0

Cảm ơn - Tôi đã tìm thấy nó từ đây. Đây có phải là tiêu chuẩn SQL (tức là nó cũng làm việc trên Oracle?). Và, vấn đề hiệu suất sang một bên, là có bất kỳ giới hạn về số lượng SUBQUERIES bạn có thể làm gì? – Kevin

+0

@Kevin Subqueries có khá nhiều RDBMS (không chắc họ là một phần của tiêu chuẩn nói trên). Về mặt giới hạn, nó phụ thuộc vào kích thước/hình dạng dữ liệu của bạn, nhưng tôi thường cố gắng không sử dụng nhiều hơn một truy vấn phụ nếu có thể. (Trong nhiều trường hợp một đồng bằng [JOIN] (http://dev.mysql.com/doc/refman/5.0/en/join.html), hoặc đôi khi một [CASE] (http://dev.mysql.com/ doc/refman/5.0/en/case-statement.html) hoặc bảng tạm thời có thể phù hợp hơn.) –

+0

Câu trả lời rất rõ ràng và hữu ích. Cảm ơn vì đã cứu tôi rất nhiều công việc. – 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

đây đi truy vấn của bạn:

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

Bạn có thể sử dụng giá trị foobar trong kết quả truy vấn của bạn để xác định kết quả của phương trình thứ hai.

Tôi nghĩ, điều này sẽ cho bạn một gợi ý về cách thực hiện.

Các vấn đề liên quan