从具有公共字段的多个表转储数据

时间:2011-04-12 18:15:40

标签: mysql sql join

嘿所有。 我有一堆表有一些共同的字段将它们绑在一起,但我无法找到以有意义的方式转储它们的正确方法。

基本上,用户将获得两次测试,每次测试可能会多次进行。

主表存储有关用户和测试的信息,类似于下面的内容(我们将此表称为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专家,但我在发布之前已经调查过了。我觉得我必须接近正确的答案,但只是没有完全打击它。

有人能给我一些指导吗?

2 个答案:

答案 0 :(得分: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 ...

答案 1 :(得分: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语句。