2016-06-09 3 views
0

Я пытаюсь отобразить все общие наклоны (от 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; 
} 

Что случилось с моим запросом? Он должен вернуть только два идентификатора.

+0

Не критикую, просто интересно, из любопытства, почему вы бы построить запрос таким образом, вместо того, чтобы просто более прямой 'Выберите поля из соединяемых таблиц WHERE условия met' подход? Похоже, довольно простой запрос sql был расколото и перетасован. – Uueerdo

+0

Я ценю комментарий, на самом деле я открыт для любого предложения, чтобы сделать запрос более простым. Есть ли у вас пример для такого синтаксиса? – remyremy

ответ

1

Вы должны использовать из одной таблицы beacuse использовать присоединиться ко второму

$this->db->from('game_slopes'); 

Если оставить две таблицы вы получите декартово произведение как для таблицы

+0

Так просто! большое спасибо! – remyremy

0

Чтобы показать прямой перевод, линия для линии ...

SELECT 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 
FROM game_slopes, game_created_slopes 
INNER JOIN game_created_slopes as created_slopes_tbl ON game_slopes.id_slope = created_slopes_tbl.id_slope 
WHERE created_slopes_tbl.id_status = 1 
AND game_slopes.id_sector = 1 
AND created_slopes_tbl.id_player = $currentUserID 
; 

я форматировать его больше как это, хотя (и удаление случайного перекрестного соединения, а также обновление ссылочный/псевдоним, используемый)

SELECT DISTINCT game_slopes.id_slope, game_slopes.id_sector 
    , created_slopes_tbl.id_slope, created_slopes_tbl.id_created_slopes 
    , created_slopes_tbl.id_player 
FROM game_slopes 
    INNER JOIN game_created_slopes AS created_slopes_tbl 
     ON game_slopes.id_slope = created_slopes_tbl.id_slope 
WHERE created_slopes_tbl.id_status = 1 
    AND game_slopes.id_sector = 1 
    AND created_slopes_tbl.id_player = $currentUserID 
; 

Наконец, хотя я не совсем знаком с php; Я бы заменил $currentUserID на ? и превратил его в параметризованный запрос.


Хотя, я ленивый машинистка (и был псевдонимы быть полезны позже, когда таблицы нужно заменить на подзапросах).

SELECT DISTINCT gs.id_slope, gs.id_sector 
    , gcs.id_slope, gcs.id_created_slopes 
    , gcs.id_player 
FROM game_slopes AS gs 
    INNER JOIN game_created_slopes AS gcs 
     ON gs.id_slope = gcs.id_slope 
WHERE gcs.id_status = 1 
    AND gs.id_sector = 1 
    AND gcs.id_player = $currentUserID 
; 
Смежные вопросы