希望这不是太主观,但是:
我遇到一个问题,我需要根据一个 ID 从四个不同的表中查询数据。此数据具有相似但不相同的字段,需要为每个表显示这些字段。本质上,如果我有表 A、B、C 和 D,那么对于 ID N,我可能需要按以下顺序显示行:
A1
B1
B2
B3
C1
D1
D2
D3
D4
但是,由于某些 B 和 D 需要我连接到许多表,并且我有数万条记录,所以我不想为每个 ID 发送四个复杂的查询。我正在预先构建我的数据——创建一个临时表来存放每个最终的 A、B、C、D 数据,然后通过 ID 直接查询这些行。有没有更快的方法?我考虑过使用 UNION,但我的行并不都具有相同类型的列(例如,对于类型 A 的行,我可能需要显示日期,而类型 C 的行将具有整数天偏移量)。
我目前的做法:
foreach ($ids as $id) {
$a = "SELECT * FROM a JOIN xyz (...) WHERE id = ?";
$b = "SELECT * FROM b JOIN xyz (...) WHERE id = ?";
$c = "SELECT * FROM c JOIN xyz (...) WHERE id = ?";
$d = "SELECT * FROM d JOIN xyz (...) WHERE id = ?";
print query($a, $id)->fetch();
print query($b, $id)->fetchAll();
print query($c, $id)->fetch();
print query($d, $id)->fetchAll();
}
或者类似的东西
最佳答案
首先,我绝对不会查询数据库 4 次。我会尝试只查询数据库一次,即使它需要讨厌的长 sql 代码,以减少服务器和数据库之间的往返。
就像评论中的“Consider Me”和“Gordon Linoff”一样,我会创建一个查询,其中包含所有表中的所有字段,并将它们全部 UNION。对于某些表独有的字段,我会在对其他表的查询中声明它们时将其放入“null”。
例如:
select t.description as 'Description', null as 'Value'
from A t
UNION
select null as 'Description', t.value as 'Value'
from B t
您还可以返回所有表的所有字段并为每个返回的字段添加前缀,以便您知道它来自哪个表。
例如:
select t.description as 'A_Description'
from A t
UNION
select t.value as 'B_Value'
from B t
为了简单、安全和高效,我会将整个 sql 代码放在一个用户定义的函数中,该函数返回一个表,您可以从服务器端代码将其解释为记录集。该函数会将 ID 作为参数。这也可以通过 View 的形式来实现。
为了提高效率,我会在表用于连接的每个字段上放置索引,这应该会大大减少查询时间。
一般来说,我也会试着找出这个函数在一天/小时/分钟/秒内被调用了多少次。 如果经常需要函数提供的数据,那么可能需要一种完全不同的方法——重新排列整个数据库。然而,如果数据是静态或半静态的,那么缓存机制可能就足够了——以另一个数据库表、服务器端静态对象甚至客户端静态对象的形式。
您的问题没有简单的答案,因为有多种因素需要考虑。
关于sql - 如何合并和显示来自多个表的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532318/