战舰SQL查询

时间:2014-02-04 19:37:17

标签: mysql sql database select join

这是关于战舰及其战斗的模式:

 Ships(name, yearLaunched, country, numGuns, gunSize, displacement)
 Battles(ship, battleName, result)

典型的Ships元组将是:

 ('New Jersey', 1943, 'USA', 9, 16, 46000)

这意味着战舰新泽西州于1943年发射;它属于美国,装有9门16英寸(枪管或枪管内径)的枪,加重(以航空方式移位)46,000吨。战斗的典型元组是:

 ('Hood', 'North Atlantic', 'sunk')

列出在战斗中互相争斗的所有国家对。仅列出每对一次,并将其列为首先按字母顺序排在第一位的国家/地区。

目前,我有这个用于实现,但它打印出所有匹配而不是正确的结果。

SELECT a.country, b.country 
  FROM ships a, ships b, battles b1, battles b2 
     WHERE a.name=b1.ship and b1.battleName=b2.battleName
       AND a.country>b.country

1 个答案:

答案 0 :(得分:0)

显式连接是首选。 尝试使用DISTINCT删除重复项,并且不要忘记ORDER它们。 在这里,我们假设每场战争中只有两个国家(他们互相争斗)。

SELECT DISTINCT s1.country, s2.country
FROM battles b1
JOIN ships s1
ON s1.name = b1.ship
JOIN battles b2
ON b2.battlename = b1.battlename
JOIN ships s2
ON s2.name = b2.ship
WHERE s1.country > s2.country
ORDER BY s1.country, s2.country