【问题标题】:mysql join two tables that one table is having multiple matching rowsmysql连接两个表,一个表有多个匹配的行
【发布时间】:2014-08-09 21:11:24
【问题描述】:

我正在尝试加入两个表。假设第一个表是 test1,另一个是 test2 在 test1 表中我有字段 HOTEL_ID 姓名 城市 国家

然后在 test2 表中我有 ROOM_ID HOTEL_ID ROOM_TYPE

因此,大多数情况下,酒店都有多种类型的客房。所以当我使用这个查询加入这两个表时

$this->db->like('city', $visitingPlace);
$this->db->or_like('country', $visitingPlace);
$this->db->or_like('name', $visitingPlace);
$this->db->limit($per_page, $page);
$this->db->select('*')
         ->from('test1')
         ->join('test2', 'test1.hotel_id = test2.hotel_id', 'left');
$query = $this->db->get();

它重复显示与该酒店 ID 匹配的每个房间类型的酒店名称,但我想在所有房间类型中显示一次酒店名称。我怎样才能做到这一点?

谢谢

【问题讨论】:

  • 最好在 PHP 中完成,在 codeigniter/activerecord 中执行会产生相对复杂的查询。
  • 在显示输出时,如果酒店名称与上一行相同,则不要显示酒店名称。将酒店名称保存在变量中,以便您进行比较。
  • 那么问题出在哪里?您已经在相同的结果中获得了酒店详细信息和房间。从第一行显示酒店详细信息,并通过迭代所有结果来显示房间。您无需更改任何内容!

标签: php mysql join


【解决方案1】:

问题被标记为“mysql”,所以这里有一个 MySQL 解决方案:

select h.*, group_concat(distinct room_type) as RoomTypes
from test1 h left join
     test2 r
     on h.hotel_id = r.hotel_id
group by h.hotel_id;

对于每家酒店,这将生成一列,其中包含酒店房间类型的列表。

【讨论】:

  • 我试过这个,但这样我只能从第二张桌子上取房间类型。如果我想从第二张表中获取多个字段,我该怎么做?
  • @Yasitha 。 . .您应该用样本数据和期望的结果提出另一个问题。这将澄清你的要求。注意:如果您编辑此问题,您可能会使此处的答案无效,这简直不好。
  • 如果你知道如何做我想做的事,请写成 cmets
【解决方案2】:

您使用相同的查询,因为它只是按酒店 ID 添加订单,并且在 php 中使用逻辑只显示每组房间的酒店名称一次

$this->db->like('t1.city', $visitingPlace);
$this->db->or_like('t1.country', $visitingPlace);
$this->db->or_like('t1.name', $visitingPlace);
$this->db->limit($per_page, $page);
$this->db->select('t1.*,t2.ROOM_TYPE')
         ->from('test1 t1')
         ->join('test2 t2', 't1.hotel_id = t2.hotel_id', 'left')
->order_by('t1.hotel_id','ASC');

从查询中获取结果

$results = $this->db->get()->result();

循环遍历每组房间的结果商店酒店 ID 并仅显示一次

$currentParent = false;
foreach ($results as $r) {
    if ($currentParent != $r->hotel_id ) {
        echo '<h1>Hote Name ' . $r->name. '</h1>';
        $currentParent = $r->hotel_id;
    }
    echo '<p>' .$r->ROOM_TYPE. '</p>';
}

样本输出

<h1>Hote Name test1</h1>
    <p>room type 1</p>
    <p>room type 2</p>
<h1>Hote Name test 2</h1>
    <p> room type 3</p>

等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多