2014-12-15 16 views
7

Tôi đã tìm kiếm diễn đàn để tìm giải pháp cho vấn đề của mình. Vấn đề của tôi là tôi không thể tìm ra cách để lưu một vị trí xếp hạng của mỗi giải đấu được tổ chức. Tôi đã tạo hai bảng và một truy vấn trông như thế này: đối thủ cạnh tranh (cid int auto_increment khóa chính, tên varchar (25), lastname varchar (25)); comps (comp int int auto_increment khóa chính, int tournement, cid int, int điểm);Lưu trữ vị trí xếp hạng từ mysql

select @rowno:= @rowno+1 as position, rank.* 
    from (
    select name,lastname,SUM(points) as pts,group_concat(points) as round FROM 
    (select cid,tournament,points from comps 
    group by cid,tournament order by points)total 
    join competitors c on c.cid = total.cid 
    cross join (select @rowno := 0) r 
    group by total.cid 
    order by pts desc) rank 
    order by pts desc 

Đây là SQLFiddle demo

Điều tôi muốn đạt được là khi người dùng đã nhấp vào một đối thủ cạnh tranh hồ sơ các vị trí được hiển thị cho mỗi giải đấu như thế này:

Name: Competitor One 
Tournament 1: 1st 100 pts 
Tournament 2: 2nd 80 pts 
Tournament 3: 10th 30 pts 

Tôi có nhóm các điểm nhưng tôi không có đầu mối làm thế nào để làm điều đó với các vị trí. Điều này có thể từ truy vấn này hay tôi phải tạo một bảng mới như các vị trí (pid int auto_increment khóa chính, int giải đấu, cid int, int vị trí), nơi tôi chèn từng vị trí cho từng đối thủ cạnh tranh.

Hy vọng rằng một người nào đó hiểu được vấn đề của tôi và có thể cho tôi một số gợi ý hay giải pháp cho vấn đề này

+0

Không phải những lệnh? Vị trí là số điểm không? –

+0

Các điểm được sắp xếp đúng theo group_concat, nhưng tôi muốn lưu trữ vị trí theo cùng một cách từ biến @rowno. Tôi hy vọng nó có ý nghĩa nên vị trí và các điểm cùng nhau. – Headpetrol

+0

Vâng, xin lỗi, nhưng nếu vị trí được cho bởi các điểm tôi không thấy hữu ích để thêm một trường khác cho vị trí. Tuy nhiên bạn có thể thêm một lĩnh vực được gọi là vị trí và sau đó làm những gì bạn muốn –

Trả lời

1

Nếu hiểu biết của tôi đã đúng sau đó tôi hy vọng điều này sẽ làm việc cho bạn

select *,(SELECT COUNT(*) 
      FROM comps AS cmp2 
      WHERE cmp1.points < cmp2.points AND cmp1.tournament = cmp2.tournament) + 1 AS position 
from competitors AS c1 
inner join comps AS cmp1 on c1.cid = cmp1.cid 
order by c1.name,c1.lastname,cmp1.compid, position ASC 

Working Sql Fiddle Here

+0

đây là những gì tôi đã cố gắng để làm. CẢM ƠN BẠN! – Headpetrol

+0

Tôi đang cố gắng thực hiện điều tương tự với bảng xếp hạng nhưng tôi không thể tìm ra. Bảng xếp hạng của tôi được thiết lập như thế này [link] (http://sqlfiddle.com/#!2/a6b87/1/0) và tôi muốn nhận được cùng một điều positon sau mỗi trận đấu. – Headpetrol

0

Nếu bạn muốn kết quả mỗi giải đấu, bạn có thể làm điều đó như thế này:

select * from competitors 
inner join comps on competitors.cid = comps.cid 
order by tournament, points desc 

Nếu bạn muốn có nhóm được dễ dàng nhất là sử dụng truy vấn con để tổng hợp các điểm cho mỗi đối thủ cạnh tranh:

select *,(select sum(points) from comps where competitors.cid=comps.cid) as points 
from competitors 
order by points desc 

Và không bạn không muốn bảng có vị trí, vì tính toán dữ liệu. Lý do duy nhất bạn muốn làm đó là vì lý do hiệu suất (và cập nhật nó tự động mỗi lần x).

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