需要获得将多个表连接成一行的结果

时间:2017-03-23 21:04:21

标签: php mysql codeigniter

我想获得将多个表连接成一行并从t_cuisine表中获取多个cuisine_name的结果,并使用php(CODEIGNITER)获取t_search.cuisineId列中的cuisine_id并加入

t_search table来获取美食这样我就可以通过cuisineId获得可用的美食名称。

t_search table

searchID|restaurant_name|cuisineId
1       |     XYZ       |  1,4,5       
2       |     KIH       |  2
3       |     GHY       |  4,5
4       |     UIO       |  1,2,3
5       |     RTY       |  3,5



t_cuisine table

cuisineId|cuisine_name
   1     |  ABC
   2     |  CDE
   3     |  EFG
   4     |  GHZ
   5     |  HJL        

在我使用的模型中

$this->db->select('*');
$this->db->from('t_search');
$this->db->join('t_cuisine','t_cuisine.cuisineId =  t_search.cuisineId'); 

仅根据t_search中的cuisineId中的单个值获取数据。

3 个答案:

答案 0 :(得分:1)

$this->db->select('*');
$this->db->from('t_search');
$this->db->join('t_cuisine','t_cuisine.cuisineId IN(t_search.cuisineId)'); 
$this->db->where('t_cuisine.cuisineId', X);

将X更改为您要寻找的美食ID

Results when X=1

Results when X=2

答案 1 :(得分:0)

您之前所拥有的(当您的查询基于cuisineId中的单个值工作时)是一对多的关系。像这样的加入效果很好,因为每次搜索都有一种美食。

这是一个多对多关系,这个表结构doesn't support it well。您不需要在cuisineId表的t_search列中存储分隔列表,而是需要另一个表来表示搜索和菜肴之间的关系,如下所示:

t_search_cuisine table

searchID|cuisineId
   1    |   1
   1    |   4
   1    |   5
   2    |   2
   3    |   4
   3    |   5
   4    |   1
   4    |   2
   4    |   3
   5    |   3
   5    |   5

然后,您应该能够通过一次额外的加入来获取所有数据。

$this->db->select('*');
$this->db->from('t_search');
$this->db->join('t_search_cuisine','t_search.searchID =  t_search_cuisine.searchID');
$this->db->join('t_cuisine','t_search_cuisine.cuisineId =  t_cuisine.cuisineId');

答案 2 :(得分:0)

根据表格的结构,加入这些表格并不容易。也许你可以用两个查询代替。

    $this->db->select("cuisineId");
    $this->where("searchID", $searchID);
    $qry1 = $this->db->get("t_search");
    $res1 = $qry1->row_array();
    $qry1->free_result();

    if ($res1) {
        $this->db->select("*");
        $this->db->where_in('cuisineId', $res1);
        $qry2 = $this->db->get("t_cuisine");
        $res2 = $qry2->result();
        return ($res2) ? $res2 : false;
    }