2011-04-12 79 views
2

嘿,所有。 我有一堆表有一些共同的领域绑在一起的表,但我无法找出正确的方式来倾倒他们在一个有意义的方式。从多个具有公共字段的表中倾销数据

基本上,用户将被给予两个测试,并且每个测试可以被多次进行。

,类似于下面的关于用户和测试的主要表存储信息(我们称这个表MAIN):

user_id  test  iteration completion_time 
    1   1   1    1:00 
    1   2   1    1:30 
    1   1   2    0:49 
    1   2   2    1:30 

每一个测试网页,然后有自己的表来存储所提供的答案,因为有些页面有很多问题。我们将这个示例表称为RESULTS,但有很多这样的表基本相同。

user_id  test  iteration  q1 q2 q3 
    1   1   1   A B A 
    1   2   1   B B A 
    1   1   2   A B B 
    1   2   2   A B B 

这些结果表(再次,有很多)基本上存储结果,再加上刚好足够的信息,结果在所有的表准确地绑在一起。我这样设置,因为只用一张桌子就可以得到一张有几百列的表格,而我之前读过的表格并不推荐。

所以这里的问题是我无法弄清楚如何最好地把这些表连接在一起并得到结果。我已经读过关于联合和联盟的信息,据我所知,没有一个看起来是正确的,因为我需要一次从大约10-15张表中提取数据。

我可以做一个巨大的复杂的选择 - 沿

select m.*, a.*, b.*, c.* from main m, results_a a, results_b b, results_c c where a.user_id=m.user_id and b.user_id=m.user_id and c.user_id=m.user_id' 

和工作线的东西,但我们有了一个更好的办法。请记住,在这个例子中我只给出了3个结果表 - 在我的实际应用中,它将更像15-20个结果表。如果我想抛出任何额外的逻辑(例如,可以说,我只想要我之前查询过的相同数据,但仅用于测试2),除非是非常复杂,否则它将返回某些行的重复项,它变得更加复杂。甚至不要谈论分拣。

从我读过的内容来看,JOIN用于2个表格,而UNION结合了结果行而不是列。

我不认为是mysql专家,但是我在发布之前已经仔细研究了这一点。我觉得我必须接近正确的答案,但只是没有达到正确的答案。

任何人都可以给我一些指导吗?

回答

1

要使用内部连接尝试:

SELECT m.*, a.*, b.*, c.* 
FROM main m 
INNER JOIN results_a a ON a.user_id = m.user_id 
INNER JOIN results_b b ON b.user_id = m.user_id 
INNER JOIN results_c c ON c.user_id = m.user_id 
WHERE m.user_id = x 

为了区分列名,明确命名列,并为其分配一个别名

SELECT m.*, a.q1 as A_Q1, a.q2 as A_Q2, b.q1 as B_Q1, b.q2 as B_Q2 ... 
+0

现在说的太早了,但我认为这肯定让我指出了正确的方向。非常感谢! – jk2 2011-04-12 18:30:00

0

我想你设计你的数据库的方式,你将不得不做连接。这听起来比替代方案(大型,非标准化表格)更好。你想要出去什么?查看所有测试并确定用户的最佳分数?

所以,如果我理解你有多个用户(显然)的表。每个用户可以进行多项测试。每次测试都可以进行多次。

select m.*, a.*, b.*, c.* from main m 
join results_a a 
on a.user_id = m.user_id and a.test_id = m.test_id and a.iteration_id = m.iteration_id 
join results_b b 
on b.user_id = m.user_id and b.test_id = m.test_id and b.iteration_id = m.iteration_id 
join results_c c 
on c.user_id = m.user_id and c.test_id = m.test_id and c.iteration_id = m.iteration_id 

这应该会给每个迭代,每个测试,每个用户一行。如果您想为用户进行某种测试,请添加:

where m.user_id = @userid and m.test_id = @testid 

然后您可以查看用户测试的所有迭代。

如果你想要最新的迭代: select top(1) ...

where m.user_id = @userid and m.test_id = @testid 
order by m.iteration_id desc 

你可能会考虑当生成你的问题建立这样一个观点,你不必产生在游程的select语句代表特定测试的时间。

相关问题