为了账号安全,请及时绑定邮箱和手机立即绑定

我如何从两个表中搜索数据,它们不相关

我如何从两个表中搜索数据,它们不相关

PHP
FFIVE 2022-12-11 09:24:30
我正在尝试构建一个搜索框以从 2 个表中找出相似的标题。艺术表- id 标题类型赠款表- id Title Type现在我只能显示 grants 表中的数据,如果搜索与标题类似的内容,我如何显示两个表的结果?模型function searchResult($keyword){  $this->db->like('title',$keyword);  $this->db->or_like('open_to',$keyword);$this->db->from('v_grants');$query  =   $this->db->get();  return $query->result();}控制器function searchResult() {    $keyword    =   $this->input->post('keyword');    $data['results']    =   $this->products_model->searchResult($keyword);    $this->load->view('searchresults.php', $data);}看法<form class="form-inline my-2 my-md-0" action="<?php echo site_url('starter/searchResult');?>" method = "post">  <input class="form-control" type="text" name = "keyword"/><br><table><?php if (count($results) > 0){foreach($results as $row){ ?><table class="table"><tr>    <td><h2><a href="<?=  base_url()?>product/grantindividual/<?=$row->id?>"><?php echo $row->title?> </h2></a>  </tr><?php   }}else { ?><br><br><h1> No results found. </h1><?php }?></table>
查看完整描述

1 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

会有一些人会建议您进行单独的查询并合并结果集,因为这会减少脚本卷积。


会有其他人赞成使用 UNION ALL 来组合两个表查询,因为他们更喜欢单次访问数据库或者你不需要在第一次 SELECT 之后为列添加别名(对于列名的情况不同)。


我会满足您的要求,但要明白满足您的要求的方法不止一种。


CodeIgniter 目前不提供 UNION 方法,因此您可以对活动记录做的最好(AFAIK)是编译两个 SELECT 查询并在调用内部执行 UNION query()。


实际呈现的查询和结果集可能会略有不同,具体取决于您的数据库适配器——这种多功能性是 CodeIgniter 查询构建方法的一个特性。


我包括一个额外的列 ( source),以便您可以在显示数据时做出明智的决定(关于超链接等)。否则,您可能会引用一个id值但不知道它id引用的是哪个表。


代码:


$this->db->select($this->db->escape('v_grants') . ' AS source, id, title, type');

$this->db->from('v_grants');

$this->db->like('title', $keyword);

$this->db->or_like('open_to', $keyword);

$vGrantsQuery = $this->db->get_compiled_select();


$this->db->select($this->db->escape('art') . ', id, title, type');

$this->db->from('art');

$this->db->like('title', $keyword);

$this->db->or_like('open_to', $keyword);

$artQuery = $this->db->get_compiled_select();

/*

var_export([

    $this->db->query($vGrantsQuery . ' UNION ALL ' . $artQuery)->result(),

    $this->db->last_query()

]);

*/

return $this->db->query($vGrantsQuery . ' UNION ALL ' . $artQuery)->result();

ps Model 方法result()将生成一个空数组或一个对象数组。在您看来,您不需要count();只需检查if (!$result) {——这将告诉您结果集是否为空。


查看完整回答
反对 回复 2022-12-11
  • 1 回答
  • 0 关注
  • 74 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号