SQL لجلب نتائج "مطابقة" مماثلة حسب النسبة المئوية

StackOverflow https://stackoverflow.com/questions/19824298

  •  05-07-2022
  •  | 
  •  

سؤال

يخزن هذا الجدول أصوات المستخدم بين مباريات المستخدم. هناك دائمًا فائز واحد وخاسر واحد والناخب.

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

إنها تعيد حاليًا صفوفًا فارغة ، ولا ينبغي أن تكون هناك. ما لا يزال يحتاج إلى تحسين (ولا يمكن وضع إصبعي عليه) هو:

  1. جلب المستخدمين المشابهة للمستخدم ABC فقط
  2. حدد الشرط الذي يحدد من هو مستخدم مشابه لـ ، على سبيل المثال معرف المستخدم = 6 (حيث يكون لدى المستخدمين المشابهين اختلاف +/- 10 ٪ في النسبة المئوية مع معرف المستخدم 6)

سيكون موضع تقدير أي مساعدة. شكرًا!

هل كانت مفيدة؟

المحلول

لحساب انتصارات وخسائر كل مستخدم دون الحاجة إلى الانضمام إلى الجدول لنفسه واستخدام الوصلات الخارجية ، من الممكن فقط اختيار الفوز والخسائر بشكل منفصل والقيام باتحاد بينهما ، ولكن مع معلومات إضافية إذا تم تقديم الصف يمثل الفوز لصالحه المستخدم ، أو الخسارة.

ثم ، من السهل حساب جميع الانتصارات والخسائر لكل مستخدم. كان الجزء الصعب هو دمج خيار تحديد المستخدم الذي ترغب في مقارنة ملفات التعريف. لقد فعلت ذلك بمتغير يتم تعيينه على قيمة percentage من المستخدم مع المعطى user_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