Я пытаюсь отобразить все общие наклоны (от game_slopes
) от сектора 1, которые построены (т. Е. Присутствуют в game_created_slopes
) и status_id = 1.mysql JOIN query возвращает несколько раз те же строки
CREATE TABLE `game_created_slopes` (
`id_created_slopes` int(11) NOT NULL,
`id_player` int(11) NOT NULL,
`id_slope` int(11) NOT NULL,
`custom_name` varchar(45) DEFAULT NULL,
`slope_condition` int(3) NOT NULL,
`id_status` int(11) NOT NULL,
`end_construction` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `game_created_slopes` (`id_created_slopes`, `id_player`, `id_slope`, `custom_name`, `slope_condition`, `id_status`, `end_construction`) VALUES
(168, 46, 6, 'Slope 24', 50, 1, '2016-05-17 17:01:25'),
(170, 46, 1, 'Slope 1', 1, 1, '2016-06-06 18:35:22'),
(172, 46, 7, 'Slope 3', 100, 1, '2016-06-08 21:48:43');
CREATE TABLE `game_slopes` (
`id_slope` int(11) NOT NULL,
`id_sector` int(11) NOT NULL,
`name_english` varchar(45) NOT NULL,
`name_french` varchar(45) DEFAULT NULL,
`length` int(11) NOT NULL,
`id_difficulty` int(11) NOT NULL,
`cost` int(11) NOT NULL,
`building_time` int(11) NOT NULL,
`reputation` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `game_slopes` (`id_slope`, `id_sector`, `name_english`, `name_french`, `length`, `id_difficulty`, `cost`, `building_time`, `reputation`) VALUES
(1, 1, 'Slope 1', 'Piste 1', 2000, 1, 1000000, 13, 3000),
(6, 1, 'Slope 2', 'Piste 2', 1000, 2, 100000, 15, 5000),
(7, 2, 'Slope 3', 'Piste 3', 1400, 3, 200000, 5, 8000),
(8, 1, 'Slope 5', 'Piste 5', 1456, 4, 105000, 20, 5040);
К сожалению, два результата, которые должны быть возвращены (ID 168 и 170) возвращается три раза каждый. Я заметил, что если game_created_slopes
содержит 5 строк, то два идентификатора будут возвращены 5 раз каждый.
(ID 172 в секторе 2, чтобы он не вернулся)
Мой запрос:
$this->db->distinct('game_slopes.id_slope, game_slopes.id_sector, game_created_slopes.id_slope, game_created_slopes.id_created_slopes, game_created_slopes.id_player');
$this->db->from('game_slopes, game_created_slopes');
$this->db->join('game_created_slopes as created_slopes_tbl', 'game_slopes.id_slope = created_slopes_tbl.id_slope', 'inner');
$this->db->where('created_slopes_tbl.id_status', '1');
$this->db->where('game_slopes.id_sector', '1);
$this->db->where('created_slopes_tbl.id_player', $currentUserID);
$query = $this->db->get();
PHP код:
$num_slopes_for_this_sector = $this->Model->get_slopes_($currentUserID);
foreach ($num_slopes_for_this_sector->result() as $row){
echo '<br>SECTOR :'. $i;
echo '<br>id_created_slopes:'.$row->id_created_slopes;
}
Что случилось с моим запросом? Он должен вернуть только два идентификатора.
Не критикую, просто интересно, из любопытства, почему вы бы построить запрос таким образом, вместо того, чтобы просто более прямой 'Выберите поля из соединяемых таблиц WHERE условия met' подход? Похоже, довольно простой запрос sql был расколото и перетасован. – Uueerdo
Я ценю комментарий, на самом деле я открыт для любого предложения, чтобы сделать запрос более простым. Есть ли у вас пример для такого синтаксиса? – remyremy