我有一个表,其中包含有关某个月的信息,该行中的一列将有另一个表的mysql行id来从中获取多个信息
是否有更有效的方式来获取信息,而不是爆炸id并在每个上执行单独的SQL查询...这是一个例子:
Row ID | Name | Other Sources
1 Test 1,2,7
Other Sources
具有来自另一个表的行的id,就像这样
Row ID | Name | Information | Link
1 John | No info yet? | http://blah.com
2 Liam | No info yet? | http://blah.com
7 Steve| No info yet? | http://blah.com
总体而言,返回的信息如下所示
Hi this page is called test... here is a list of our sources
- John (No info yet?) find it here at http://blah.com
- Liam (No info yet?) find it here at http://blah.com
- Steve (No info yet?) find it here at http://blah.com
我会这样做...我会爆炸其他来源,然后为每个做一个单独的SQL查询,我相信可能有更好的方法吗?
答案 0 :(得分:4)
看起来像是经典的多对多关系。你有页面和来源 - 每个页面都有很多来源,每个来源都可以作为许多页面的来源?
幸运的是,这在关系数据库设计中已经解决了很多问题。您可以使用第3个表将两者联系起来:
Pages (PageID, Name)
Sources (SourceID, Name, Information, Link)
PageSources (PageID, SourceID)
“PageSources”表的关键是PageID和SourceID。
然后,要获取页面的所有源代码,您将使用此SQL:
SELECT s.*
FROM Sources s INNER JOIN PageSources ps ON s.SourceID = ps.SourceID
AND ps.PageID = 1;
答案 1 :(得分:1)
表格结构不容易。如果你有另一张表,如:
ID Source
1 1
1 2
1 7
然后join
是你的朋友。对于它们的方式,你将不得不在“其他来源”字段中对逗号分隔值进行一些讨厌的拆分。
答案 2 :(得分:0)
也许我错过了一些明显的东西(众所周知),但为什么你在第一个表中使用单个字段使用逗号分隔的值集而不是简单的连接表。解决方案,如果这样做是微不足道的。
答案 3 :(得分:0)
这些表的问题在于,使用多值列对SQL不起作用。此格式的表格被视为normalized,因为在First Normal Form及更高版本中禁止使用多值列。
第一范式表示......
- 这些行没有自上而下的排序。
- 列中没有从左到右的排序。
- 没有重复的行。
- 每个行 - 列交叉点只包含一个 来自适用域的价值(和 没别的)。
- 所有列都是常规的[即行没有隐藏的组件,如 行ID,对象ID或隐藏时间戳]。
醇>-Chris Date,“First First Normal Form真正意味着什么”,第127-8页[4]
无论如何,做到这一点的最好方法是建立多对多关系。这是通过在中间放置第三张桌子来完成的,就像Dominic Rodger在他的回答中所做的那样。