2016-08-11 2 views
-3

У меня есть база данных гостиницы, имеющая стол, который содержит столбец, состоящий из телефонных номеров, разделенных запятыми. Я хочу сгруппировать соответствующие номера телефонов, чтобы отели, имеющие одинаковые номера телефонов (например, бесплатный номер, принадлежащий сети отелей), попадают в один и тот же идентификатор группы. Ex: A имеет номера телефонов 1,2; B имеет 2,3 и C имеет 3,4. Тогда все они должны быть в одной группе.Как нормализовать данные mysql в php и групповых сопоставлениях данных в отдельные группы?

Спасибо!

+0

Это очень общий вопрос с слишком небольшим количеством деталей, чтобы дать хороший ответ или потратить время на создание хорошего ответа. Пожалуйста, добавьте более подробную информацию, например, о некоторых табличных конструкциях, которые у вас есть или попробовали. SQL, который вы используете в настоящее время. – pcnate

ответ

0

Если я правильно понимаю это. Вам нужно создать две новые таблицы;

PhoneNumbers 
phone_id int auto-increment - Will hold the phone numbers unique Id 
telephone varchar(30) - Will hold the phone number itself 

Hotel_PhoneNumbers 
hotel_id int - The id of the hotel 
phone_id int - The id of the phone number 

Вам нужно будет создать скрипт, чтобы вытащить все отели из вашей базы данных, проходной каждый отель и взрываются полем номера телефона в массив. Затем вы хотите пройти через телефонный массив и добавить номер телефона в новую таблицу PhoneNumbers, проверяя, что он еще не существует. Если он уже существует, вам необходимо захватить идентификатор PhoneNumbers.

Затем, используя новую таблицу Hotel_PhoneNumbers, создайте новую строку, содержащую идентификатор PhoneNumber и идентификатор отеля. Это свяжет номер телефона (ы) с отелем.

Таким образом, таблица PhoneNumbers будет содержать только уникальные номера телефонов, но может быть связана с несколькими отелями.

Я не могу конкретно указать вам код, чтобы сделать это, поскольку я не знаю, как вы общаетесь с вашей базой данных. Я использую Laravel и Eloquent, поэтому он может выглядеть примерно так:

$hotels = Hotel::all(); 

foreach ($hotels as $hotel) { 
    $numbers = explode(',' $hotel->phone); 

    if (count($numbers) > 0) { 
     foreach ($numbers as $number) { 
      // See if the PhoneNumber already exists in the database 
      $phoneNumber = PhoneNumber::where('telephone', $number); 

      // If the phone number doesn't exist, we need to add the number to the database 
      if (is_null($phoneNumber)) { 
       // Create a new phone number 
       $phoneNumber = new PhoneNumber(); 
       $phoneNumber->telephone = $number; 
       $phoneNumber->save(); 
      } 

      // Check if the hotel is already linked to the phone number in the database 
      $hotelPhoneNumber = HotelPhoneNumber::where('hotel_id', $hotel->id)->where('phone_id', $phoneNumber->id); 

      // If the hotel isn't linked to the number, create the link 
      if (is_null($hotelPhoneNumber)) { 
       $hotelPhoneNumber = new HotelPhoneNumber(); 
       $hotelPhoneNumber->hotel_id = $hotel->id; 
       $hotelPhoneNumber->phone_id = $phoneNumber->id; 
       $hotelPhoneNumber->save(); 
      } 
     } 
    } 
}