php - SQLite选择多个外键到一行

标签 php sql sqlite

我正在尝试为自己制作的游戏设立高分委员会。在棋盘上,我正在使用其他两个棋盘的外键,即玩家和武器。每个分数存储玩家在该奔跑中使用的四种武器。这些表的设置如下:

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)JOINON使每个联接更加明显:

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/

相关文章:

google-app-engine - 我可以在AppEngine上打开/写入SQLite文件吗?

php - 如何捕获第二个粗体文本并将其存储到数据库中?

sql - 同时使用 group by 和 order by 查询时间慢

php - Laravel SQL 无法创建表

java - 如何在 android 中的 SQLite 数据库中运行查询?

ruby - 在ruby中使用数组查询数据库

PHP PDO 简单的插入或更新功能

php - 从 PHP Controller 运行 Python 脚本

php - 使用 CLI 来使用 phar 文件不起作用

sql - 为什么这个正则表达式在 postgreSQL 中不起作用