mysql объединяет две таблицы, в которых одна таблица имеет несколько совпадающих строк

#php #mysql #join

#php #mysql #Присоединиться

Вопрос:

Я пытаюсь объединить две таблицы. допустим, первая таблица — 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();
 

он неоднократно показывает название отеля для каждого типа номера, соответствующего этому идентификатору отеля, но я хочу показать название отеля один раз для всех типов номеров. как я могу этого добиться?

Спасибо

Комментарии:

1. Это лучше сделать на PHP, выполнение этого в codeigniter / activerecord сделает запрос сравнительно сложным.

2. Когда вы показываете выходные данные, не отображайте название отеля, если оно совпадает с предыдущей строкой. Сохраните название отеля в переменной, чтобы вы могли сравнить его.

3. Так в чем проблема? У вас уже есть данные об отеле и номерах в том же результате. Покажите информацию об отеле из первой строки и покажите номера, повторив все результаты. Вам не нужно ничего менять!

Ответ №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;
 

Для каждого отеля это приведет к созданию столбца со списком типов номеров в отеле.

Комментарии:

1. Я пробовал это, но при этом я могу взять только тип комнаты из второй таблицы. если у меня есть более одного поля, которое я хочу получить из второй таблицы, как я могу это сделать?

2. @Yasitha . , , Вы должны задать другой вопрос с образцами данных и желаемыми результатами. Это прояснит, о чем вы просите. Примечание: если вы отредактируете этот вопрос, вы можете аннулировать ответы здесь, что просто нехорошо.

3. Если вы знаете, как сделать то, что я хотел, пожалуйста, укажите в комментариях

Ответ №2:

Вы используете тот же запрос, что и просто добавляете порядок по идентификатору отеля, а в 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();
 

Цикл по результату хранит идентификатор отеля для каждой группы номеров и показывает только один раз

 $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>
 

и так далее