我正在尝试为自己制作的游戏设立高分委员会。在棋盘上,我正在使用其他两个棋盘的外键,即玩家和武器。每个分数存储玩家在该奔跑中使用的四种武器。这些表的设置如下:
Scores
id|playerid|score|weapon0id|weapon1id|weapon2id|weapon3id
Players
id|name
Weapons
id|name
我想从成绩表中选择多行,并将ID替换为适当的名称。我可以使用以下语句获取正确的玩家名称和一种武器:
SELECT scoreID, Players.playerName, scoreVal,
Weapons.weaponLabel, scoreW1, scoreW2, scoreW3
FROM Scores, Players, Weapons
WHERE Players.playerID = scorePlayer AND Weapons.weaponID = scoreW0
我到过的所有地方都表明这是从外键引用的行中获取值的最佳方法。它可以很好地适合玩家的名字,但是似乎没有办法将其扩展为一次填写多个武器名称。对剩余的武器使用“或”或对“武器ID IN”(w0,w1,w2,w3)似乎对每种武器只能获得一行,而不是在适当位置将每种武器获得一行。
仅使用select语句,有没有办法获得正确的武器名称?还是我需要进行额外的代码循环,并用正确的名称替换每个武器ID?
最佳答案
这种设计值得怀疑:weapon0..n
可能只会导致诸如此类的困难查询。查询也必须取消规范化-例如每个weapon0..n
一个连接。
无论如何,该查询是错误的,并且将返回比期望更多的行,因为它使用FROM a,b
形式,这意味着a和b之间的CROSS JOIN,并且WHERE中没有合适的选择器使其成为等联接。尝试使用普通(INNER)JOIN
和ON
使每个联接更加明显:
SELECT s.scoreID, p.playerName, s.scoreVal,
w0.weaponLabel as w0Label,
w1.weaponLabel as w1Label
-- etc
FROM Scores s
JOIN Players p ON p.id = s.playerID
JOIN Weapons w0 ON w0.weaponID = s.scoreW0
JOIN Weapons w1 ON w1.weaponID = s.scoreW1
-- etc, ick!!!
到现在为止,显而易见的是,为什么非规范化数据很危险!
每列必须以不同的关系(w0,w1等)连接。
关于php - SQLite选择多个外键到一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16702310/