我有一个索引表,每个记录都有一个记录字段和一个数据类型字段,我还有4个数据表,它们都有相同的字段。如何从索引表中检索x条记录,并根据数据类型的值,将该记录连接到适当的数据表,并在单个记录集中返回整批记录?例如: indexrec1有recordid=12和datatype=text,其余的字段将来自文本表中对应于recordid=12的文本表。indexrec2记录了9和datatype=image,其余字段将来自图像表中对应于recordid=9的图像表。
这将在PHP下的Apache服务器上运行。请温柔一点,我不是MySQL专家--如果有可能的话,“白痴指南”的回答会很棒.
发布于 2017-06-16 15:50:30
您需要的是一个带有联接的查询来链接所需的每个表。
例如:
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
阅读有关join在join.asp中的更多信息
发布于 2017-06-16 15:57:51
对每个表执行单独的查询,并将它们与UNION组合。
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对所有类型继续此模式。
但是,如果所有数据表都有相同的字段,为什么要将它们作为单独的表呢?
发布于 2017-06-16 18:26:18
它确实“有效”,但没有给出预期的结果。
我创建了一个索引表、一个文本表和一个num表--后两个表具有相同的字段名。
然后我创建了两个索引记录,一个用于访问文本表中的记录,另一个用于访问num表中的记录。(在文本和名词中创建记录)
然后运行以下sql:
选择
test_index、test_id、test_index.datatype、test_index.externalrecid、test_index.something、test_nums.rec_id、test_nums、datatype、test_nums.value1、test_nums.valu2、test_text.rec_id、test_text.datatype、d21.d22>代码>,从test_nums.datatype=test_index.datatype左加入test_nums,在test_text.datatype=test_index.datatype上左加入test_text
然后,我在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专家.
https://stackoverflow.com/questions/44592711
复制相似问题