2016-04-24 63 views
-1

tables in MYSQL如何將兩個數據庫錶轉換爲多維JSON文件?

上面的圖片顯示了我的MYSQL數據庫中的兩個表格;一張帶設施的桌子和另一張帶這些設施的營業時間表。當然,實際上我的數據庫中有更多的記錄,但結構是一樣的。

我想將每個「設施」轉換爲Google地圖上的標記。標記應該包含關於設施的一些信息。爲此,我需要用PHP創建我的數據的JSON表示。 JSON文件將通過JQUERY獲取。過去幾天我一直在掙扎的問題是將兩個表中的數據合併到如下所示的多維JSON文件中。

如何將PHP中的兩個數組(如果這是我應該這樣做的)在PHP中(或兩個表中)來獲取下面的JSON文件?

[{ 
    "id": "1", 
    "name": "Facility One", 
    "city": "Texas", 
    "postalCode": "34928", 
    "postalCity": "Texas", 
    "streetAdress": "Big Street 82", 
    "phone": "555-948 342", 
    "website": "www.facilityone.com", 
    "lat": "32.329484", 
    "lng": "87.027483", 
    "openHours": [{ 
     "weekday": "1", 
     "open": "06:00:00", 
     "close": "22:00:00" 
    }, { 
     "weekday": "2", 
     "open": "06:00:00", 
     "close": "22:00:00" 
    }, { 
     "weekday": "3", 
     "open": "06:00:00", 
     "close": "22:00:00" 
    }, { 
     "weekday": "4", 
     "open": "06:00:00", 
     "close": "22:00:00" 
    }, { 
     "weekday": "5", 
     "open": "06:00:00", 
     "close": "22:00:00" 
    }, { 
     "weekday": "6", 
     "open": "08:00:00", 
     "close": "20:00:00" 
    }, { 
     "weekday": "7", 
     "open": "10:00:00", 
     "close": "20:00:00" 
    }] 
}, { 
    "id": "2", 
    "name": "Facility Two", 
    "city": "Chicago", 
    "postalCode": "49384", 
    "postalCity": "Chicago", 
    "streetAdress": "Small Street 48", 
    "phone": "555-329 094", 
    "website": "www.facilitytwo.com", 
    "lat": "59.928384", 
    "lng": "95.293875", 
    "openHours": [{ 
     "weekday": "1", 
     "open": "07:30:00", 
     "close": "22:00:00" 
    }, { 
     "weekday": "2", 
     "open": "07:30:00", 
     "close": "22:00:00" 
    }, { 
     "weekday": "3", 
     "open": "07:30:00", 
     "close": "22:00:00" 
    }, { 
     "weekday": "4", 
     "open": "07:30:00", 
     "close": "22:00:00" 
    }, { 
     "weekday": "5", 
     "open": "07:30:00", 
     "close": "22:00:00" 
    }, { 
     "weekday": "6", 
     "open": "09:00:00", 
     "close": "20:00:00" 
    }, { 
     "weekday": "7", 
     "open": "10:00:00", 
     "close": "18:00:00" 
    }] 
}] 
+0

您需要2個查詢。首先要獲得一個id爲json的設施。第二次檢索開放時間。一旦完成,你將它添加到你的第一個JSON。 – cpugourou

+0

如何將openhours-json添加到PHP中的facilities-json中,使最終結果看起來像我的問題中的json? –

回答

0

感謝您的建議傢伙!我非常感謝他們。這是我去的解決方案:

$result1=mysqli_query($conn,$sql1); 

$MainArray = array(); 
$Facilities = array(); 
$OpeningHours = array(); 

while ($row1=mysqli_fetch_assoc($result1)) { 

    $Facilities['FacilityId'] = $row1['FacilityId']; 
    $Facilities['FacilityName'] = $row1['FacilityName']; 
    $Facilities['FacilityCity'] = $row1['FacilityCity']; 
    $Facilities['FacilityPostalCode'] = $row1['FacilityPostalCode']; 
    $Facilities['FacilityPostalCity'] = $row1['FacilityPostalCity']; 
    $Facilities['FacilityStreetAddress'] = $row1['FacilityStreetAddress']; 
    $Facilities['FacilityPhoneNumber'] = $row1['FacilityPhoneNumber']; 
    $Facilities['FacilityWebsite'] = $row1['FacilityWebsite']; 
    $Facilities['lat'] = $row1['lat']; 
    $Facilities['lng'] = $row1['lng']; 
    $Facilities['OpeningHours'] = array(); 

    $sql2 = "SELECT * FROM OpeningHours WHERE OpeningHoursFacility = " .$row1['FacilityId'].""; 
    $result2=mysqli_query($conn,$sql2); 

    while ($row2=mysqli_fetch_assoc($result2)) { 

     $OpeningHours['OpeningHoursWeekday'] = $row2['OpeningHoursWeekday']; 
     $OpeningHours['OpeningHour'] = $row2['OpeningHour']; 
     $OpeningHours['ClosingHour'] = $row2['ClosingHour']; 
     array_push($Facilities['OpeningHours'],$OpeningHours); 
    }  

    array_push($MainArray,$Facilities); 
} 

$jsonData = json_encode(array('Facilities' => $MainArray), JSON_PRETTY_PRINT); 

echo $jsonData; 
1

這應該可能在PHP中完成,但作爲一個有趣的挑戰(我很無聊)我以爲我嘗試在純MySQL中做到這一點。

SET SESSION group_concat_max_len = 10000000; 
SELECT CONCAT('[{', 
    GROUP_CONCAT(CONCAT(
    '"id": "',id,'",', 
    '"name": "',name,'",', 
    '"city": "',city,'",', 
    '"postalCode": "',postalCode,'",', 
    '"postalCity": "',postalCity,'",', 
    '"streetAdress": "',streetAddress,'",', 
    '"phone": "',phone,'",', 
    '"website": "',website,'",', 
    '"lat": "',lat,'",', 
    '"lng": "',lng,'",', 
    T.openHours 
    ) 
    ORDER BY id ASC SEPARATOR '}, {' 
    ),'}]' 
) as JSON 
FROM facilities f 
INNER JOIN 
    (SELECT facility, 
      CONCAT('"openHours": [{', 
      GROUP_CONCAT(
       CONCAT('"weekday": "',weekday,'",', 
         '"open": "',openHour,'",', 
         '"close": "',closeHour,'"' 
        ) 
      ORDER BY weekday asc SEPARATOR '}, {' 
         ), 
        '}]' 
      ) as openHours 
    FROM facility_openhours 
    GROUP BY facility 
    )as T 
    ON f.id = T.facility 

sqlfiddle

sqlfiddle輸出: [{"id": "1","name": "Facility One","city": "Texas","postalCode": "34928","postalCity": "Texas","streetAdress": "Big Street 82","phone": "555-948 342","website": "www.facilityone.com","lat": "32.329484","lng": "87.027483","openHours": [{"weekday": "1","open": "06:00:00","close": "22:00:00"}, {"weekday": "2","open": "06:00:00","close": "22:00:00"}, {"weekday": "3","open": "06:00:00","close": "22:00:00"}, {"weekday": "4","open": "06:00:00","close": "22:00:00"}, {"weekday": "5","open": "06:00:00","close": "22:00:00"}, {"weekday": "6","open": "08:00:00","close": "20:00:00"}, {"weekday": "7","open": "10:00:00","close": "20:00:00"}]}, {"id": "2","name": "Facility Two","city": "Chicago","postalCode": "49384","postalCity": "Chicago","streetAdress": "Small Street 48","phone": "555-329 094","website": "www.facilitytwo.com","lat": "59.928384","lng": "95.293875","openHours": [{"weekday": "1","open": "07:30:00","close": "22:00:00"}, {"weekday": "2","open": "07:30:00","close": "22:00:00"}, {"weekday": "3","open": "07:30:00","close": "22:00:00"}, {"weekday": "4","open": "07:30:00","close": "22:00:00"}, {"weekday": "5","open": "07:30:00","close": "22:00:00"}, {"weekday": "6","open": "09:00:00","close": "20:00:00"}, {"weekday": "7","open": "10:00:00","close": "18:00:00"}]}]

+0

感謝您的建議。我一直在玩它,但顯然我沒有權限設置group_concat_max_len,所以我的JSON最終被切斷。 我想用PHP來做這個,所以如果有人能告訴我我會非常感激。 –

+0

請看看我的PHP答案,讓我知道如果這對你有用 –

0

這裏是一個可能的解決方案的PHP。

我有一個db.php其中規定了我的$康恩與

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); 

然後我包括我的所有網頁的db.php中。

<?php include 'db.php';?> 
<?php 
    $sql = "SELECT id,name,city,postalcode,postalcity,streetaddress,phone,website,lat,lng,"; 
    $sql .= "facility,weekday,openhour as `open`,closehour as `close` "; 
    $sql .= "FROM facilities f INNER JOIN facility_openhours fo ON fo.facility = f.id "; 
    $sql .= "ORDER BY f.id ASC, fo.weekday ASC"; 
    $stmt = $conn->prepare($sql); 

    $facilities = array(); 
    if ($stmt->execute()) { 
     while ($row = $stmt->fetch()) { 
      $weekday = intval($row['weekday']); 
      // if it's weekday 1, we set up our array 
      if ($weekday == 1){ 
       $openHours = array(); 
      } 
      $single_day = array("weekday" => $row['weekday'], 
           "open" => $row['open'], 
           "close" => $row['close'] 
           ); 

      // add this single day to our openHours array 
      array_push($openHours, $single_day);     

      if ($weekday == 7){ 
       $facility = array("id" => $row['id'], 
            "name" => $row['name'], 
            "city" => $row['city'], 
            "postalCode" => $row['postalcode'], 
            "postalCity" => $row['postalcity'], 
            "streetAddress" => $row['streetaddress'], 
            "phone" => $row['phone'], 
            "website" => $row['website'], 
            "lat" => $row['lat'], 
            "lng" => $row['lng'], 
            "openHours" => $openHours 
           ); 
       // add this facility to facilities 
       array_push($facilities, $facility); 
      } 
     } 
    } 

    $my_json = json_encode($facilities); 
    echo $my_json; 
?> 
+0

非常感謝@Tin Tran! 你的答案中有一些我不熟悉的方法。我去了另一個解決方案(見下文)。 –

+0

你的方法似乎做了多個查詢......每個設施一個查詢。 我的方法只是將開放時間排隊,然後每當它到達第7天時就增加設施,因爲此時所有開放時間爲7天。 –

相關問題