У меня есть база данных отелей с таблицей, которая содержит столбец, состоящий из телефонных номеров, разделенных запятыми.
Я хочу сгруппировать совпадающие номера телефонов так, чтобы отели с одинаковыми номерами телефонов (например, бесплатный номер, общий для сети отелей) попадали в один и тот же идентификатор группы.
Пример: А имеет номера телефонов 1,2; B имеет 2,3 и C имеет 3,4. Тогда все они должны быть в одной группе.
Спасибо!
Если я правильно понимаю Вы захотите создать две новые таблицы;
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
Вам нужно будет создать скрипт PHP, чтобы вытащить все отели из вашей базы данных, пройтись по каждому отелю и разложить поле номера телефона в массив. Затем вы хотите пройтись по массиву телефонов и добавить номер телефона в новую таблицу PhoneNumbers, проверив, что он еще не существует. Если он уже существует, вам нужно получить идентификатор PhoneNumbers.
Затем, используя новую таблицу Hotel_PhoneNumbers, создайте новую строку, содержащую PhoneNumber Id и Hotel Id. Это связывает номера телефонов с отелем.
При этом таблица 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();
}
}
}
}
Других решений пока нет …