根据主表中字段的值,为每条记录加入备用表

时间:2017-06-16 15:15:41

标签: php mysql database

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

  1. 这是否可行,若然,我该怎么做。
  2. 如果可能,那么它会比从索引表中检索记录更快,然后在适当的数据表上单独执行sql qry吗?
  3. 这将在PHP下的Apache服务器上运行。 请保持温和,我不是MySQL专家 - 如果可能的话,“白痴指南”的答案会很棒......

3 个答案:

答案 0 :(得分:0)

您需要的是一个带有连接的查询,以链接您需要的每个表

例如:

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

详细了解cordova-android-support-gradle-release

中的join

答案 1 :(得分:0)

对每个表执行单独查询,并将它们与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

为所有类型继续此模式。

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

答案 2 :(得分:0)

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

我创建了一个索引表,一个文本表和一个nums表 - 后者2具有相同的字段名。

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

然后我运行了以下sql:

  

选择test_indextest_idtest_indexdatatypetest_indexexternalrecidtest_index。{{1} },somethingtest_numsrec_idtest_numsdatatypetest_numsvalue1test_numsvalu2test_textrec_idtest_textdatatypetest_textvalue1test_text FROM {{ 1}} LEFT JOIN valu2 ON test_indextest_nums = test_numsdatatype LEFT JOIN test_index ON datatype。{{ 1}} = test_texttest_text

PHPMyAdmin results screenshot

然后我在php脚本中运行相同的sql并打印生成的行并得到了这个:

  

数组([test_id] => 1 [数据类型] => text [externalrecid] => 1 [something] => indextable [rec_id] => 1 [value1] =>文本值1 [ valu2] =>文本值2)

     

数组([test_id] => 2 [datatype] => [externalrecid] => 1 [something] =>应为nums [rec_id] => [value1] => [valu2] = >)

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

因此,我得出结论,给定字段名称的第二个值会覆盖第一个值,因此我无法使用此方法。

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

但好的一面是:

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

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

我的(本土)模板引擎需要进行修改,以便在将值解析到模板之前测试字段的值(处理中减少了近75%)并且应该加快一切(我的次要目标)

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