문제

이 테이블에 저장 사용자 투표는 사용자와 일치합니다.항상 하나 승자가,하나의 패배하고 유권자입니다.

CREATE TABLE `user_versus` (
  `id_user_versus` int(11) NOT NULL AUTO_INCREMENT,
  `id_user_winner` int(10) unsigned NOT NULL,
  `id_user_loser` int(10) unsigned NOT NULL,
  `id_user` int(10) unsigned NOT NULL,
  `date_versus` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id_user_versus`),
  KEY `id_user_winner` (`id_user_winner`,`id_user_loser`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ;

INSERT INTO `user_versus` (`id_user_versus`, `id_user_winner`, `id_user_loser`, `id_user`, `date_versus`) VALUES
(1, 6, 7, 1, '2013-10-25 23:02:57'),
(2, 6, 8, 1, '2013-10-25 23:02:57'),
(3, 6, 9, 1, '2013-10-25 23:03:04'),
(4, 6, 10, 1, '2013-10-25 23:03:04'),
(5, 6, 11, 1, '2013-10-25 23:03:10'),
(6, 6, 12, 1, '2013-10-25 23:03:10'),
(7, 6, 13, 1, '2013-10-25 23:03:18'),
(8, 6, 14, 1, '2013-10-25 23:03:18'),
(9, 7, 6, 2, '2013-10-26 04:02:57'),
(10, 8, 6, 2, '2013-10-26 04:02:57'),
(11, 9, 8, 2, '2013-10-26 04:03:04'),
(12, 9, 10, 2, '2013-10-26 04:03:04'),
(13, 9, 11, 2, '2013-10-26 04:03:10'),
(14, 9, 12, 2, '2013-10-26 04:03:10'),
(15, 9, 13, 2, '2013-10-26 04:03:18'),
(16, 9, 14, 2, '2013-10-26 04:03:18');

나는 작업에 대한 쿼리를 가져오는 유사한 프로필에 있습니다.프로필 비슷한 때에는 투표 비율(승 대 잃)은+/-10%를 지정한다.

SELECT id_user_winner AS id_user,
    IFNULL(wins, 0) AS wins,
    IFNULL(loses, 0) AS loses,
    IFNULL(wins, 0) + IFNULL(loses, 0) AS total,
    IFNULL(wins, 0) / (IFNULL(wins, 0) + IFNULL(loses, 0)) AS percent
FROM
(
    SELECT id_user_winner AS id_user FROM user_versus 
    UNION
    SELECT id_user_loser FROM user_versus 
) AS u
LEFT JOIN
(
    SELECT id_user_winner, COUNT(*) AS wins
    FROM user_versus
    GROUP BY id_user_winner
) AS w
ON u.id_user = id_user_winner
LEFT JOIN
(
    SELECT id_user_loser, COUNT(*) AS loses
    FROM user_versus
    GROUP BY id_user_loser
) AS l
ON u.id_user = l.id_user_loser

이것은 현재의 결과는:

mysql result

그것은 현재는 NULL 을 반환한 행,그리고 그들은되지 않아야 합니다.무엇을 얻을 최적화(수 없어 매우 내에 손가락 it):

  1. 사용자와 비슷한 사용자만 ABC
  2. 지정 조건을 정의 하는 유사한 사용자가,예를 들어,사용자 id=6(는 유사한 사용자는+/-10%차이를 비율과 사용자 id6)

어떤 도움이 될 것입니다 감사합니다.감사합니다!

도움이 되었습니까?

해결책

을 계산하는 승리고의 손실을 각 사용자에 가입하지 않고도 테이블을 사용하여 외부 조인,그것은 단지 선택 승 및 손실에는 별도로 하고 유니온 사이에 있는 모든 것을,하지만 추가적인 정보를 주는 경우 행를 나타내는 승리한 사용자 또는 손실이다.

그런 다음,그것은 쉽게 계산하는 모든 승 및 손실에 대한 각 사용자에 따라 다릅니다.까다로운 부분이었을 통합하는 옵션을 지정하고 싶은 사용자 프로필을 비교.았다는 변수를 설정되는 값의 percentage 의 사용자가 지정된 user_id, 할 수 있는 변경에서 일정한 변수.

여기에 내 계획안(비교하는 사용자 id=6):

SELECT
    player_id AS id_user,
    wins,
    losses,
    wins + losses AS total,
    wins / (wins + losses) AS percent
  FROM (
    SELECT
        player_id,
        SUM(is_a_win) wins,
        SUM(is_a_loss) losses,
        CASE
          WHEN player_id = 6
            THEN @the_user_score := SUM(is_a_win) / (SUM(is_a_win) + SUM(is_a_loss))
          ELSE NULL
         END
      FROM (
        SELECT id_user_winner AS player_id, 1 AS is_a_win, 0 AS is_a_loss FROM user_versus
        UNION ALL SELECT id_user_loser, 0, 1 FROM user_versus
      ) games
    GROUP BY player_id
  ) data
WHERE
  ABS(wins / (wins + losses) - @the_user_score) <= 0.1
;

출력:

ID_USER WINS   LOSSES  TOTAL   PERCENT
6       8       2       10      0.8
9       6       1       7       0.8571

수은 물론 제거하는 사용자의 프로필을 기본 비교를 위해 추가하여 player_id != 6 (또,최종 솔루션,일부 변수 이름)조건을 가장 바깥 WHERE 절입니다.

예 SQLFiddle: 매칭 프로파일 예제

를 제출할 수 있습니다면 이것은 당신이 무엇을 찾고 있었고,그렇지 않은 경우,어떤 출력겠습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top