2015-10-01 2 views
-1

С следующей базой: GГДЕ В запросе?

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

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

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

ответ

2

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

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 

Если это ошибка, сообщите мне об этом, и мы постараемся ее исправить.

+1

Это тоже работает. – suarsenegger

+0

@javipedrera Рад помочь – nowhere

2

Вы можете использовать оператор 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) 
+0

Спасибо, это работает. Вы очень помогли мне: D – suarsenegger

1

enter image description here

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

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

+0

У вас есть более короткий путь, если вы присоединитесь к солдату с battle_log и, наконец, сразитесь;) – nowhere

+0

А ... На самом деле у моего потока есть только 3 основные сущности (солдат, планета и битва), равные вашему потоку :) –

+0

Но если вы не добавляете battle_log, как вы знаете, сражался ли солдат на битве на определенной планете? – nowhere

Смежные вопросы