Я нашел похожие темы, но во многих результатах используется mysqli_multi_query, чего я хочу избежать из-за будущих реализаций пользовательских запросов.
В настоящее время я достигаю своего желаемого результата с использованием следующего PHP, но у меня есть ощущение, что есть более эффективный метод, который мне не хватает. Я также боюсь одновременных запросов и возможности такого задействованного процесса, занимающего связи. Хотя пользовательская загрузка в любой момент не должна быть> 20.
Вот код, любая критика или проницательность оценены! (Я все еще изучаю PHP, когда я иду, поэтому мой код, скорее всего, дерьмо в этом отношении!):
Схема таблицы (которая также нуждается в работе - разработка лучшей структуры по существу):
CREATE TABLE 'EAM'(
'EAM_ID' INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
'EAM_IPADDR' VARCHAR(15) NOT NULL,
'EAM_PORT' INT(5) NOT NULL,
'EAM_STATE' VARCHAR(6) NOT NULL);
CREATE TABLE 'ACTIVE'(
'EAM_ID' INT NOT NULL,
'ACTIVE_STATUS' VARCHAR(25) NOT NULL,
'ACTIVE_TIME' TIME DEFAULT NULL,
FOREIGN KEY (EAM_ID) REFERENCES EAM(EAM_ID));
CREATE TABLE 'MAP_IMG' (
'MAP_IMG_BLDG' varchar(25) NOT NULL,
'MAP_IMG_ROOM' varchar(25) NOT NULL,
'MAP_IMG_X' int(8) DEFAULT NULL,
'MAP_IMG_Y' int(8) DEFAULT NULL,
'MAP_IMG_ROOM_STATUS' varchar(10) NOT NULL DEFAULT 'NOTCLEAR');
CREATE TABLE 'LOCATION'(
'LOCATION_ROOM' VARCHAR(25) NOT NULL PRIMARY KEY,
'LOCATION_BLDG' VARCHAR(25) NOT NULL,
'EAM_ID' INT NOT NULL,
'LOCATION_COMMENT' VARCHAR(250) DEFAULT NULL,
FOREIGN KEY (EAM_ID) REFERENCES EAM(EAM_ID));
$dbQuery = "SELECT EAM_ID FROM LOCATION WHERE LOCATION_BLDG = 'LQ1'"; //TODO: Eventually make this 'LQ1' a variable for page selected.
$dbQueryResult = mysqli_query($dbConnection, $dbQuery) OR DIE("Bad Query: $dbQuery");
echo "<table class='table table-striped'><thead>";
echo "<tr><th>BUILDING</th>";
echo "<th>ROOM NUMBER</th>";
echo "<th>ROOM STATUS</th>";
echo "<th>LAST UPDATE</th>";
echo "<th>EAM IP ADDRESS</th>";
echo "<th>EAM PORT</th></tr></thead>";
while($row = mysqli_fetch_assoc($dbQueryResult)) {
$eamID = $row['EAM_ID']; //Assign EAM_ID from initial query to $eamID for use throughout subsequent queries.
$dbq2 = "SELECT LOCATION_BLDG, LOCATION_ROOM FROM LOCATION WHERE EAM_ID = $eamID";
$dbqr2 = mysqli_query($dbConnection, $dbq2) OR DIE("Bad Query: $dbq2");
while($r2 = mysqli_fetch_assoc($dbqr2)) {
echo "<tr><td>{$r2['LOCATION_BLDG']}</td>";
echo "<td>{$r2['LOCATION_ROOM']}</td>";
}
$dbq2 = "SELECT ACTIVE_STATUS, ACTIVE_TIME FROM ACTIVE WHERE EAM_ID = $eamID";
$dbqr2 = mysqli_query($dbConnection, $dbq2) OR DIE("Bad Query: $dbq2");
while($r2 = mysqli_fetch_assoc($dbqr2)) {
echo "<td>{$r2['ACTIVE_STATUS']}</td>";
echo "<td>{$r2['ACTIVE_TIME']}</td>";
}
$dbq2 = "SELECT EAM_IPADDR, EAM_PORT FROM EAM WHERE EAM_ID = $eamID";
$dbqr2 = mysqli_query($dbConnection, $dbq2) OR DIE("Bad Query: $dbq2");
while($r2 = mysqli_fetch_assoc($dbqr2)) {
echo "<td>{$r2['EAM_IPADDR']}</td>";
echo "<td>{$r2['EAM_PORT']}</td></tr>";
}
}
Вместо того, чтобы делать запросы в цикле для получения связанных данных, используйте один запрос вверху, чтобы вернуть данные.
SELECT
a.'EAM_ID',
a.'LOCATION_BLDG',
a.'LOCATION_ROOM',
b.'ACTIVE_STATUS',
b.'ACTIVE_TIME'
FROM 'LOCATION' a
LEFT JOIN 'ACTIVE' b
ON a.'EAM_ID' = b.'EAM_ID'
LEFT JOIN 'EAM' c
ON a.'EAM_ID' = c.'EAM_ID'
WHERE a.'LOCATION_BLDG' = 'LQ1'