首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据主表中字段的值连接每个记录的替换表

根据主表中字段的值连接每个记录的替换表
EN

Stack Overflow用户
提问于 2017-06-16 15:15:41
回答 3查看 28关注 0票数 0

我有一个索引表,每个记录都有一个记录字段和一个数据类型字段,我还有4个数据表,它们都有相同的字段。如何从索引表中检索x条记录,并根据数据类型的值,将该记录连接到适当的数据表,并在单个记录集中返回整批记录?例如: indexrec1有recordid=12和datatype=text,其余的字段将来自文本表中对应于recordid=12的文本表。indexrec2记录了9和datatype=image,其余字段将来自图像表中对应于recordid=9的图像表。

  1. 这有可能吗?如果有,我该怎么做。
  2. 如果可能的话,它会比从索引表检索记录,然后对适当的数据表执行单独的sql更快吗?

这将在PHP下的Apache服务器上运行。请温柔一点,我不是MySQL专家--如果有可能的话,“白痴指南”的回答会很棒.

EN

回答 3

Stack Overflow用户

发布于 2017-06-16 15:50:30

您需要的是一个带有联接的查询来链接所需的每个表。

例如:

代码语言:javascript
复制
select rec1.indexrec1,rec2.* from rec1
inner join [text table] as rec2 on
rec1.indexrec1 = rec2.indexrec2

我在做什么?我是通过使用indexrec列通过内部连接来显示表[rec1]中的索引和[text table] as rec2中的所有列。

但是有一个陷阱,使用inner join只会显示与此条件rec1.indexrec1 = rec2.indexrec2匹配的记录。

根据您的实际需要,您可以使用不同的Joins

阅读有关joinjoin.asp中的更多信息

票数 0
EN

Stack Overflow用户

发布于 2017-06-16 15:57:51

对每个表执行单独的查询,并将它们与UNION组合。

代码语言:javascript
复制
SELECT *
FROM indexTable AS i
JOIN textTable AS t ON i.recordId = t.recordId
WHERE i.datatype = 'text' AND i.recordId = 12

UNION ALL

SELECT *
FROM indexTable AS i
JOIN imageTable AS im ON i.recordId = im.recordId
WHERE i.datatype = 'image' AND i.recordId = 12

对所有类型继续此模式。

但是,如果所有数据表都有相同的字段,为什么要将它们作为单独的表呢?

票数 0
EN

Stack Overflow用户

发布于 2017-06-16 18:26:18

它确实“有效”,但没有给出预期的结果。

我创建了一个索引表、一个文本表和一个num表--后两个表具有相同的字段名。

然后我创建了两个索引记录,一个用于访问文本表中的记录,另一个用于访问num表中的记录。(在文本和名词中创建记录)

然后运行以下sql:

选择test_indextest_idtest_index.datatypetest_index.externalrecidtest_index.somethingtest_nums.rec_idtest_numsdatatypetest_nums.value1test_nums.valu2test_text.rec_idtest_text.datatyped21.d22>代码>,从test_nums.datatype=test_index.datatype左加入test_nums,在test_text.datatype=test_index.datatype上左加入test_text

PHPMyAdmin结果截图

然后,我在php脚本中运行相同的sql,并对结果行进行print_r d,得到如下结果:

数组( test_id => 1数据类型的=>文本外部信息=> 1 =>索引表rec_id => 1 value1 =>文本值1 valu2 =>文本值2) 数组( test_id => 2数据类型的=>外部性=> 1 =>应该是num rec_id => value1 => valu2 => )

如您所见,在第二个数组(记录集)中,字段的值丢失了。

因此,我得出的结论是,给定字段名的第二个值将覆盖第一个值,因此不能按目前的情况使用此方法。

在第二个数组转储中,我需要的值位于第一组字段名中,但是它们被第二组的空值覆盖。不好!

但积极的一面是:

如果我更改字段名,使它们在辅助表中都是唯一的,我将从所有表中获取所有字段。

更好的消息是,所有不想要的字段,尽管存在,都有一个NUL值,这意味着整个记录集的大小(以字节为单位)将大大减少,这是我开始时的最初目标。

我的(本地的)模板引擎需要进行修改,以便在将值解析为模板之前测试字段的值(在处理过程中减少了几乎75% ),这应该会加快一切(我的次要目标)。

感谢所有参与的人--希望这对未来的其他人有所帮助--正如我前面所说,我不是MySQL专家.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44592711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档