Я пытаюсь выполнить следующий запросMySQL MAX и MIN
SELECT `id`,
`name`,
`ownerid`,
`creationdata`,
`motd`,
(SELECT Count(*)
FROM guild_membership a,
players_online b
WHERE a.player_id = b.player_id
AND a.guild_id = id) AS `online`,
(SELECT Max(b.level)
FROM guild_membership a,
players b
WHERE a.player_id = b.id
AND a.guild_id = id) AS `toplevel`,
(SELECT Min(a.level)
FROM players a,
guild_membership b
WHERE a.id = b.player_id
AND b.guild_id = id) AS `lowlevel`
FROM `guilds`
WHERE `name` = 'Wideswing Poleaxe'
LIMIT 1;
Таблицы, используемые здесь, являются followin
CREATE TABLE IF NOT EXISTS `players` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`group_id` int(11) NOT NULL DEFAULT '1',
`account_id` int(11) NOT NULL DEFAULT '0',
`level` int(11) NOT NULL DEFAULT '1',
...
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
FOREIGN KEY (`account_id`) REFERENCES `accounts` (`id`) ON DELETE CASCADE,
KEY `vocation` (`vocation`)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `guilds` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`ownerid` int(11) NOT NULL,
`creationdata` int(11) NOT NULL,
`motd` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY (`name`),
UNIQUE KEY (`ownerid`),
FOREIGN KEY (`ownerid`) REFERENCES `players`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `guild_membership` (
`player_id` int(11) NOT NULL,
`guild_id` int(11) NOT NULL,
`rank_id` int(11) NOT NULL,
`nick` varchar(15) NOT NULL DEFAULT '',
PRIMARY KEY (`player_id`),
FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (`guild_id`) REFERENCES `guilds` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (`rank_id`) REFERENCES `guild_ranks` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
Я пытаюсь получить уровень MAX и уровень мин, от игрок стол внутри одной гильдии
Тем не менее, я всегда получаю уровень и низкий уровень того же значения, и всегда самый низкий уровень
Я не уверен, что это неправильно
Ваше поле онлайн, вероятно, только когда-либо будет на один или на нуль; и вам гарантируется только одно из этих значений (в том же наборе значений данных), если все игроки одновременно находятся в сети или в автономном режиме. (т. е. вам не нужен подзапрос). – Uueerdo
@Uueerdo: Если это так, таблица 'player' должна либо просто иметь флаг онлайн yes/no, либо, для получения дополнительных данных, иметь' id_player_online'.Но это наоборот: в таблице 'players_online' есть' id_player', что позволяет одному игроку быть несколько раз в этой таблице. Таким образом, мой запрос совпадает с datamodel, но, конечно, это может быть сбой в модели, и тогда все может быть так же просто, как вы описываете. –
Я судил, как оригинальный вопрос использовал таблицу 'players_online'; если это так, как вы его интерпретировали, их первоначальный запрос получил бы общее количество раз, когда игроки были в сети. В любом случае, ваше значение 'online' будет изменчивым, поскольку оно не является агрегированным или сгруппированным по запросу, содержащему подзапрос, в который он рассчитывается; вместо этого он будет получать количество раз, когда эффективный случайный игрок этой гильдии был в сети. – Uueerdo