带有连接和可选匹配的SQL查询

时间:2015-04-01 14:26:46

标签: mysql

我正在编写一个mapper来从我的数据库中获取信息。

这是数据库:

  • spel(id,naam)

  • spelbord(id,spel_id,level)

    fk spel_id - > id in spel

  • veld(spelbord_id,posX,posY,veldNr,isTarget,Toegang)

    fk spelbord_id - >在spelbord中的id

  • entiteit(spelbord_id,posX,posY,entiteitNr)

    fk spelbord_id - >草案中的spelbord_id

    fk posX - > posX in veld

    fk posY - >草地上的posY

所以我希望我的查询能够给我: posX,posY,veldNr,Toegang,是每个草原的目标(并且如果它存在的话,它们都是存在的)。

例如:

1, 2, 1, true, false, 1

(这个领域有兴趣),或

1, 3, 1, true, false, null

(这个领域没有任何想法)。

这是我的查询,但似乎无效

select v.posX, v.posY, v.veldNR, v.toegang, v.isTarget, i.EntiteitNr 
from spel as s
join spelbord as sb ON sb.Spel_ID = s.ID 
join veld v ON sb.id = v.Spelbord_id 
join entiteit i ON v.PosX = i.veld_PosX AND v.PosY = i.veld_PosY 
order by posX,posY

通过这个查询,我只得到输出,其中确实存在与其连接的信息。

我需要更改哪些内容才能获得无法匹配的行?

1 个答案:

答案 0 :(得分:0)

您的查询已结束;你需要在Enteitit和其他表之间的连接中添加一个单词LEFT。对于您需要选择的数据,您似乎根本不需要使用Spel或Spelbord:

SELECT v.posX, v.posY, v.veldNR, v.toegang, v.isTarget, i.EntiteitNr
  FROM veld AS v
  LEFT JOIN entiteit AS i ON v.PosX = i.veld_PosX AND v.PosY = i.veld_PosY
 ORDER BY posX, posY

Spel和Spelbord的存在与否不应影响结果。如果它们确实有所作为,那么您当然可以添加它们,但除非Spel和Spelbord中的ID列不是主键,否则它不太可能成为问题。 (你记录了外键;这很好。也可以记录候选键。)