2012-05-25 43 views
3

为了扩展我以前的问题 - 我的数据库中有两个表,我想提取某些信息。如下表:SQL:连接到同一主数据库的多个外键的表(2)

(player): player_id (primary), playerName 
    (match): match_id (primary), playerID1, playerID2, playerID3, scorer etc.. 

你给我提供了下面的代码来获得的球员的名字:

SELECT p.Name 
FROM `match` m 
INNER JOIN `player` p 
    ON p.player_id IN (m.playerID1, m.playerID2, m.playerID3) //etc 

作品beauitfully感谢 - 但只是两个调整,我想作:

1)我想返回得分手的名字以及球员的名字。由于m.scorer是一个ID,如果p.Name已经映射到m.playerID,我如何将它映射到p.Name属性? 2)上面的查询返回所有玩家的名字。我很快就会添加一个搜索功能,以便为某个玩家搜索所有匹配项。是否有排除该球员的结果(因为我们已经知道这名球员是在比赛中,因为他被搜查)。因此,几乎所有的比赛都会返回给某位球员,但是从结果中排除实际搜索到的球员。对不起,如果这不清楚,让我知道,我会扩大它。

再次感谢了很大的帮助

+0

表是完全错误的(这就是为什么你需要摆弄)。 'match'表不应该有'player_ds'列表作为列的列表,这会打破2NF。即使你有这个问题“固定”,这将导致未来大量问题。你应该有一个'match_player(match_id,player_id,score)'和PK'(match_id,player_id)'。这消除了所有问题,并且** any **查询所需的代码将变得简单。 “多个PK引用一个父母”是一个不同的问题,而不是一个问题.. – PerformanceDBA

回答

3

尝试像以下(假设字段名)。它会显示玩家的名字,比赛的matchId以及他们是否在比赛中得分。

SELECT p.Name as 'Player Name', m.matchId as 'Match Id', 
CASE s.scorerId WHEN ISNULL(S.SCORERID,0) THEN 'YES' ELSE 'NO' END as 'Scored?', 
s.name as 'Scorer Name' --as requested from comment 
FROM match m 
INNER JOIN player p ON p.player_id IN (m.playerID1, m.playerID2, m.playerID3) 
LEFT JOIN scorer s ON s.matchId = m.matchId 
    AND s.player_id IN (m.playerID1, m.playerID2, m.playerID3) 

看到这个SQLFiddle HERE

+0

嗨!非常感谢伟大的代码,我没有考虑为记分员创建一个新表。是否有一种操作代码的方式,以便我在得分手列中返回得分手名称?我知道在这里看起来很愚蠢,得到的名字,然后再次得分手的名字,但它会有意义,当我稍后申请一些PHP代码。再次感谢! – user1416876

+0

没问题!检查我的编辑,我已经将's.nams作为'Scorer Name''添加到查询中:)。 – mattytommo

+0

嗨!表'记分员'没有名字栏 - 我需要添加吗?希望我可以从playerName链接它,所以我没有存储两次相同的数据。 – user1416876

相关问题