2016-02-27 62 views
0
SELECT team_with.participant1,team_with.participant2,team_with.participant3 
FROM event,team_with 
WHERE team_with.for_event_no=event.event_no AND 
event.event_no=4 AND 
team_with.participant1=9 OR 
team_with.participant2=9 OR 
team_with.participant3=9; 

我写了特定的查询,并在一行中获得了所需的ID。我无法修改这个查询,以便代替这些id,显示连接到id的名字。使用单个查询替换ID的名称使用单个查询

student_detatil表由PK(sam_id)和属性name组成。

当前查询显示的ID是连接到student_detail.sam_id.的FK。

+1

查看正常化。没有其他解决方案值得考虑 – Strawberry

+0

好的,我会尝试。 – klbm9999

+1

@Strawberry如果可能的话,这将是一个更好的解决方案。 – jpw

回答

0

这似乎是一个糟糕的设计,以繁殖存储不同参与者的列。考虑为每个参与者创建一个单独的行并将它们存储在一个表中。你的加入逻辑也会更容易。

此外,请使用明确的JOIN语法 - 通过将连接逻辑与数据检索条件分开,使查询更加清晰易懂。

请记住,运营商AND优先于OR,因此您的event.event_no = 4不适用于每个参与者条件。我相信这是一个错误,但你是一个判断的人。

对于查询本身,您可以将OR条件应用到连接中,或者只需加入student_detail表三次。

SELECT 
    s1.name, 
    s2.name, 
    s3.name 
FROM 
    event e 
    INNER JOIN team_with t ON t.for_event_no = e.event_no 
    LEFT JOIN student_detail s1 ON s1.sam_id = t.participant1 
    LEFT JOIN student_detail s2 ON s2.sam_id = t.participant2 
    LEFT JOIN student_detail s3 ON s3.sam_id = t.participant3 
WHERE 
    e.event_no = 4 
    AND (t.participant1=9 OR t.participant2=9 OR t.participant3=9); 
+0

谢谢。这工作。关于设计,每个事件有不同数量的参与者,但并不总是3.因此,我为团队成员存储了不同的列。你能提出更好的建议吗? – klbm9999

+0

您应该为事件中的参与者提供表格,并将该列存储为外键以指向您的表格。通过这种方式,不同数量的参与者不会将您的列与事件 –

+0

相乘。但是在这种情况下,表的数量将等于事件的数量。拥有如此多数量的表格是否是一个好设计? (我有32个不同的事件) – klbm9999