如何规范化 php 中的 mysql 数据并将匹配数据分组到单独的组中?

How do I normalize mysql data in php and group matching data into separate groups?

我有一个酒店数据库,其中有一个 table,其中有一列由 phone 个数字组成,用逗号分隔。 我想对匹配的 phone 号码进行分组,以便具有相同 phone 号码的酒店(例如:连锁酒店常见的免费电话号码)属于同一组 ID。 例如:A 有 phone 个数字 1,2; B 有 2,3,C 有 3,4。那么他们都应该在同一个组中。

谢谢!

如果我理解正确的话。您将要创建两个新的 tables;

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 脚本以将所有酒店从您的数据库中拉出,遍历每个酒店并将 phone 数字字段分解为一个数组。然后你想遍历 phone 数组并将 phone 号码添加到新的 PhoneNumbers table 中,检查它是否不存在。如果它已经存在,那么您需要获取 PhoneNumbers Id。

然后,使用新的 Hotel_PhoneNumbers table,创建一个包含电话号码 ID 和酒店 ID 的新行。这会将 phone 个号码链接到酒店。

通过这样做,PhoneNumbers table 将只包含唯一的 phone 号码,但可以链接到多个酒店。

我不能具体地为您提供执行此操作的代码,因为我不知道您如何与数据库通信。我使用 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();
            } 
        }
    }
}