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