Я думаю Я мог бы понять, какова ваша цель.Если это так, я не думаю, что вы хотите группировать по рангу клана, как вы заявляете - я думаю, что вы просите присоединиться на основе ранга клана.
SELECT rm.memberid AS member_id,
rm.rosterxp AS roster_xp,
rm.gameid AS game_id,
cr.id AS crid,
cr.title AS rank_title,
cr.minimumxp AS rank_min,
cr.abbreviation AS rank_abbr,
cr.image AS rank_image
FROM roster_members AS rm
LEFT JOIN clan_ranks AS cr ON cr.minimumXP =
(SELECT crm.minimumXP
FROM clan_ranks crm
WHERE crm.minimumXP < rm.rosterXP
ORDER BY minimumXP DESC limit 1)
WHERE rm.gameID = :game_id
ORDER BY rm.rosterXP DESC
* LEFT JOIN
тольконеобходимо, если у вас есть значения в roster_members.rosterXP
, которые ниже, чем ваши самые низкие clan_ranks.minimumXP
.Если это не случай, то будет достаточно INNER JOIN
.
Разница между объединениями LEFT
, RIGHT
и INNER
заключается в следующем:
-
INNER JOIN
ограничит результаты записями, которые полностью соответствуют «обеим сторонам» (записи в таблице «слева» и «справа» оператора соединения существуют на основе предложения ON
) - A
LEFT JOIN
заявляет, что все записи для таблиц, указанных слева от объединения, будут включены, даже если записи для таблиц направо'.Если записи не существуют, NULL
значения будут заменены для каждого из полей, указанных для этой таблицы. - A
RIGHT JOIN
является обратной стороной LEFT JOIN
.
Обратите внимание, что я переставил расположение полей.Это для удобочитаемости, исходя из возможности того, что записи в clan_ranks
не существуют.Если они не существуют, первые поля, которые вы увидите, будут содержать данные (из roster_members), а поля, расположенные справа налево в наборе результатов, будут NULL
.Это никоим образом не является обязательным требованием - это просто соглашение.
Кроме того, я удалил префиксы базы данных и добавил заполнитель для удобства чтения.