ГДЕ В запросе?

Со следующей базой данных: G

Мне нужно выбрать всех солдат, которые были ТОЛЬКО в боях на своей планете, и я понятия не имею, как это сделать.

Это то, что я пробовал.

SELECT id_soldier, name 
FROM soldier, battle_log, battle 
WHERE IN(...soldier.planet_id = battle.id_planet_battle...) 

person suarsenegger    schedule 01.10.2015    source источник


Ответы (3)


Поскольку у меня нет доступа к базе данных, я не могу проверить это, но вы можете попробовать?

SELECT id_soldier, name 
FROM soldier s 
LEFT JOIN battle_log l ON s.id_soldier = l.soldier_id 
LEFT JOIN battle b ON l.battle_id = b.id_battle 
WHERE s.planet_id = b.id_planet_battle

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

person nowhere    schedule 01.10.2015
comment
@javipedrera Рад помочь - person nowhere; 01.10.2015

Вы можете использовать оператор not exists, чтобы исключить солдат, участвовавших в боях на других планетах:

SELECT *
FROM   soldier s
WHERE  NOT EXISTS (SELECT *
                   FROM   battle b
                   JOIN   battle_log bl ON b.id_battle = bl.battle_id
                   WHERE  bl.soldier_id = s.id_soldier AND
                          b.id_planet_battle != s.planet_id)
person Mureinik    schedule 01.10.2015
comment
Спасибо, это работает. Вы мне очень помогли :D - person suarsenegger; 01.10.2015

введите здесь описание изображения

Я думаю, вы можете использовать простой запрос и присоединиться к этому шагу.

Если я правильно понимаю, солдат присоединяется к планете (у солдата есть собственная планета) Затем присоединяйтесь к битве за планету (потому что планета, у которой есть солдат, сражается)

person Chanom First    schedule 01.10.2015
comment
У вас будет более короткий путь, если вы присоединитесь к солдату с Battle_log и, наконец, сразитесь ;) - person nowhere; 01.10.2015
comment
Ах... На самом деле в моем потоке есть только 3 основных объекта (солдат, планета и битва), равных вашему потоку :) - person Chanom First; 01.10.2015
comment
Но если вы не добавите Battle_log, как вы узнаете, участвовал ли солдат в битве на определенной планете? - person nowhere; 01.10.2015