从 Codeigniter 中的多个表中获取和排序选定数据
Fetch and order selected data from multiple tables in Codeigniter
我正在努力解决以下问题:
在我的数据库中有两个table,具有以下相同的结构
两个 table 都有关于图像的数据,一个用于民用飞机注册,另一个用于军事注册。
我需要 select 来自两个 table 的最新 100 张上传图片。
另外,我需要将上面 table 中的 id 与其他 table 连接起来以检索注册码。
我正在使用 Codeigniter rel。 3 及以下是我使用 Active Records 编写的代码。
$this->regs_db->select ("
$this->table_images_civil.imgid,
$this->table_images_civil.id,
$this->table_images_civil.image,
$this->table_images_civil.status,
$this->table_images_civil.uploadtime,
$this->table_images_military.imgid,
$this->table_images_military.id,
$this->table_images_military.image,
$this->table_images_military.status,
$this->table_images_military.uploadtime,
$this->table_registrations.registration,
$this->table_military.mm
");
$this->regs_db->from("$this->table_images_civil, $this->table_images_military");
$this->regs_db->join("$this->table_register", "$this->table_images_civil.id = $this->table_register.id","left");
$this->regs_db->join("$this->table_registrations", "$this->table_register.rid = $this->table_registrations.rid","left");
$this->regs_db->join("$this->table_military", "$this->table_images_military.id = $this->table_military.id","left");
$this->regs_db->limit($limit, $start);
$this->regs_db->order_by("$this->table_images_civil.uploadtime", "asc");
$this->regs_db->order_by("$this->table_images_military.uploadtime", "asc");
$this->regs_db->order_by($col, $dir);
$query = $this->regs_db->get();
if($query->num_rows() > 0)
{
return $query->result();
}
else
{
return null;
}
代码无法正常工作....如果我去掉 joined table 中的“left”参数,经过几秒钟的等待,我会得到大量数据的结果。 ..远远超过数据库中的实际图像数量。在 join table 中使用“left”参数代码不起作用...我收到 503 服务器错误。
有解决此问题的提示吗?
非常感谢任何反馈。
我不熟悉 code igniter,但我很熟悉 SQL。
我建议将其分解为 3 个查询。 2 个内部查询,每个查询 table,另一个围绕这两个查询。可以这样想:select 来自每个 table 的最近 100 行,然后合并它们,select 来自该合并的最近 100 行。
SELECT
`Source`,
`imgid`,
`id`,
`image`,
`status`,
`uploadtime`
FROM
(
SELECT
'1' AS `Source`,
`imgid`,
`id`,
`image`,
`status`,
`uploadtime`
FROM `table_images_civil`
ORDER BY `uploadtime` ASC
LIMIT 100
UNION
SELECT
'2' AS `Source`,
`imgid`,
`id`,
`image`,
`status`,
`uploadtime`
FROM `table_images_military`
ORDER BY `uploadtime` ASC
LIMIT 100
)
ORDER BY `uploadtime` ASC
LIMIT 100
列 source
就在那里,以防万一您需要知道数据来自哪个 table。
请注意,内部 select 均有 100 行。这是因为如果军用或民用都拥有前 100 名,那么该限制将为外部 select 提供足够的行,而不会在服务器上为最外层查询增加更多开销。
不确定这将如何在代码启动器中编码,但您应该能够弄清楚那部分。希望 SQL 声明对您有所帮助,并以易于理解的形式传达了想法。
下面的代码工作正常...但是如果我在内部 select
中添加 ORDER BY 和 LIMIT 行,我会收到查询语法错误
$query = $this->regs_db->query("
SELECT
source,
imgid,
id,
image,
status,
uploadtime
FROM
(
SELECT
'1' AS source,
imgid,
id,
image,
status,
uploadtime
FROM $this->table_images_civil
UNION ALL
SELECT
'2' AS source,
imgid,
id,
image,
status,
uploadtime
FROM $this->table_images_military
)
result
ORDER BY result.uploadtime DESC
LIMIT 10
");
if($query->num_rows() > 0)
{
return $query->result();
}
else
{
return null;
}
我正在努力解决以下问题:
在我的数据库中有两个table,具有以下相同的结构
两个 table 都有关于图像的数据,一个用于民用飞机注册,另一个用于军事注册。
我需要 select 来自两个 table 的最新 100 张上传图片。 另外,我需要将上面 table 中的 id 与其他 table 连接起来以检索注册码。
我正在使用 Codeigniter rel。 3 及以下是我使用 Active Records 编写的代码。
$this->regs_db->select ("
$this->table_images_civil.imgid,
$this->table_images_civil.id,
$this->table_images_civil.image,
$this->table_images_civil.status,
$this->table_images_civil.uploadtime,
$this->table_images_military.imgid,
$this->table_images_military.id,
$this->table_images_military.image,
$this->table_images_military.status,
$this->table_images_military.uploadtime,
$this->table_registrations.registration,
$this->table_military.mm
");
$this->regs_db->from("$this->table_images_civil, $this->table_images_military");
$this->regs_db->join("$this->table_register", "$this->table_images_civil.id = $this->table_register.id","left");
$this->regs_db->join("$this->table_registrations", "$this->table_register.rid = $this->table_registrations.rid","left");
$this->regs_db->join("$this->table_military", "$this->table_images_military.id = $this->table_military.id","left");
$this->regs_db->limit($limit, $start);
$this->regs_db->order_by("$this->table_images_civil.uploadtime", "asc");
$this->regs_db->order_by("$this->table_images_military.uploadtime", "asc");
$this->regs_db->order_by($col, $dir);
$query = $this->regs_db->get();
if($query->num_rows() > 0)
{
return $query->result();
}
else
{
return null;
}
代码无法正常工作....如果我去掉 joined table 中的“left”参数,经过几秒钟的等待,我会得到大量数据的结果。 ..远远超过数据库中的实际图像数量。在 join table 中使用“left”参数代码不起作用...我收到 503 服务器错误。
有解决此问题的提示吗? 非常感谢任何反馈。
我不熟悉 code igniter,但我很熟悉 SQL。
我建议将其分解为 3 个查询。 2 个内部查询,每个查询 table,另一个围绕这两个查询。可以这样想:select 来自每个 table 的最近 100 行,然后合并它们,select 来自该合并的最近 100 行。
SELECT
`Source`,
`imgid`,
`id`,
`image`,
`status`,
`uploadtime`
FROM
(
SELECT
'1' AS `Source`,
`imgid`,
`id`,
`image`,
`status`,
`uploadtime`
FROM `table_images_civil`
ORDER BY `uploadtime` ASC
LIMIT 100
UNION
SELECT
'2' AS `Source`,
`imgid`,
`id`,
`image`,
`status`,
`uploadtime`
FROM `table_images_military`
ORDER BY `uploadtime` ASC
LIMIT 100
)
ORDER BY `uploadtime` ASC
LIMIT 100
列 source
就在那里,以防万一您需要知道数据来自哪个 table。
请注意,内部 select 均有 100 行。这是因为如果军用或民用都拥有前 100 名,那么该限制将为外部 select 提供足够的行,而不会在服务器上为最外层查询增加更多开销。
不确定这将如何在代码启动器中编码,但您应该能够弄清楚那部分。希望 SQL 声明对您有所帮助,并以易于理解的形式传达了想法。
下面的代码工作正常...但是如果我在内部 select
中添加 ORDER BY 和 LIMIT 行,我会收到查询语法错误$query = $this->regs_db->query("
SELECT
source,
imgid,
id,
image,
status,
uploadtime
FROM
(
SELECT
'1' AS source,
imgid,
id,
image,
status,
uploadtime
FROM $this->table_images_civil
UNION ALL
SELECT
'2' AS source,
imgid,
id,
image,
status,
uploadtime
FROM $this->table_images_military
)
result
ORDER BY result.uploadtime DESC
LIMIT 10
");
if($query->num_rows() > 0)
{
return $query->result();
}
else
{
return null;
}