Frage

Diese Tabelle speichert Benutzerstimmen zwischen Benutzerübereinstimmungen. Es gibt immer einen Gewinner, einen Verlierer und den Wähler.

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');

Ich arbeite an einer Abfrage, die ähnliche Profile holt. Ein Profil ist ähnlich, wenn der Wahlanteil (Siege gegen Verlusten) +/- 10% des angegebenen Profils beträgt.

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

Dies ist das aktuelle Ergebnis:

mysql result

Es gibt derzeit Nullreihen zurück und sie sollten nicht da sein. Was noch optimiert werden muss (und kann meinen Finger nicht ganz darauf legen) ist:

  1. Bringen Sie Benutzer nur dem Benutzer ABC mit
  2. Geben Sie eine Bedingung an, die definiert, wer ein ähnlicher Benutzer ist wie z.

Jede Hilfe wird geschätzt. Vielen Dank!

War es hilfreich?

Lösung

Um Siege und Verluste jedes Benutzers zu berechnen, ohne sich der Tabelle an sich selbst zu verbinden und äußere Verknüpfungen zu verwenden der Benutzer oder ein Verlust.

Dann ist es einfach, alle Siege und Verluste für jeden Benutzer zu berechnen. Der schwierige Teil bestand darin, die Option zu berücksichtigen, welchen Benutzer Sie die Profile vergleichen möchten. Ich habe das mit einer Variablen gemacht, die auf den Wert von festgelegt ist percentage des Benutzers mit gegebener user_id, was Sie von einer Konstante zu einer Variablen ändern können.

Hier ist mein Vorschlag (im Vergleich zum Benutzer mit 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
;

Ausgabe:

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

Sie können den Benutzer natürlich entfernen, dessen Profil die Basis zum Vergleich durch Hinzufügen ist player_id != 6 (oder in der endgültigen Lösung ein variabler Name) Bedingung bis zur äußersten WHERE Klausel.

Beispiel bei SQLFIDDLE: Matching -Profile - Beispiel

Könnten Sie etwas Feedback geben, wenn Sie dies gesucht haben, und wenn nicht, welche Ausgabe würden Sie erwarten?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top