MYSQL запрос на поиск ранга - PullRequest
       2

MYSQL запрос на поиск ранга

0 голосов
/ 02 сентября 2018

У меня есть 2 таблицы PLAYER и спички

CREATE TABLE PLAYER 
(
id int PRIMARY KEY,
name varchar(255),
salary int
);
INSERT INTO PLAYER values(1,'MOHIT',1000);
INSERT INTO PLAYER values(2,'MNOP',2000);
INSERT INTO PLAYER values(3,'ABC',100);
INSERT INTO PLAYER values(4,'XYZ',10);

CREATE TABLE MATCHES 
(
id int,
player_id int,
scores int
);
INSERT INTO MATCHES values(1,1,100);
INSERT INTO MATCHES values(2,2,52);
INSERT INTO MATCHES values(3,3,10);
INSERT INTO MATCHES values(4,1,200);
INSERT INTO MATCHES values(5,1,300);

Может кто-нибудь сказать мне MYSQL-запрос, чтобы узнать количество совпадений, сыгранных MOHIT, чтобы выиграть двойной век (200 запусков).

Я использовал приведенный ниже запрос, но выдает ошибку SQL.

QUERY: -

 SELECT FIND_IN_SET(Select m.id from MATCHES m
  JOIN PLAYER p
  on p.id=m.player_id
  WHERE p.name='MOHIT'
  AND m.scores>=200 
  ORDER BY m.scores limit 1,(SELECT GROUP_CONCAT(
  SELECT m.id from MATCHES m 
  JOIN PLAYER p
  on p.id=m.player_id
  WHERE p.name='MOHIT'
  ))) AS RANK;

В этом запросе я пытаюсь найти первый match_id, для которого MOHIT забил двойной век, а затем найти RANK этого match_id среди всех матчей, которые он сыграл.

Ожидаемый результат должен быть 2, так как MOHIT сыграл 2 игры, чтобы набрать 200 или более 200 пробежек.

Любая помощь будет высоко оценена.

Ответы [ 4 ]

0 голосов
/ 02 сентября 2018

Я бы сделал это как:

select count(*)
from players p join
     matches m
     on p.id = m.player_id
where p.name = 'Mohit' and
      m.id < (select min(m2.id)
              from matches m2 
              where m2.player_id = m.player_id and
                    m2.score >= 200
             );
0 голосов
/ 02 сентября 2018

вариант использования, когда

SELECT p.name ,sum(case when scores>=200 then 1 else 0 end) AS no_of_match_200 
    FROM   matches m 
           JOIN player p 
             ON p.id = m.player_id 

   where p.name ='MOHIT'
   group by p.name

http://sqlfiddle.com/#!9/1762cb/7

name    no_of_match_200
MOHIT   2
0 голосов
/ 02 сентября 2018

В этом решении внутренний запрос определяет совокупный балл и количество сыгранных совпадений, внешний запрос находит самое раннее совпадение, когда совокупный балл соответствует вашему граничному условию.

select p.name,min(s.matchesplayed) matchesplayed
from player p
join
(

select m.player_id,
        (select sum(m1.scores) from matches m1 where m1.player_id = m.player_id and m1.id <= m.id) sumscore,
        (select count(m1.scores) from matches m1 where m1.player_id = m.player_id and m1.id <= m.id) matchesplayed
from matches m

) s on s.player_id = p.id
where  # p.name =  'mohit' and 
        sumscore>= 200
group by p.name;

В этом случае мой запрос найдет любого игрока.

0 голосов
/ 02 сентября 2018

Если я правильно понимаю, требования могут быть выполнены с помощью MYSQL COUNT ()

SELECT COUNT(*) AS no_of_match 
FROM   matches m 
       JOIN player p 
         ON p.id = m.player_id 
WHERE  p.NAME = 'MOHIT' 
       AND m.scores >= 200;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...