Я нашел похожие темы, но во многих результатах используется 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>";
}
}
Может быть лучше подходит для codereview
Чтобы дополнить @SloanThrasher, взгляните на LEFT JOIN, INNER JOIN и связанные с ними "объединители таблиц"
Кроме того, когда вы используете переменную для замены идентификатора местоположения, используйте параметризованный запрос и bind (), чтобы избежать внедрения SQL.






Вместо того, чтобы выполнять запросы в цикле для получения связанных данных, используйте один запрос вверху для возврата данных.
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'
Похоже, что каждый запрос внутри цикла должен возвращать данные, в противном случае HTML-таблица пользователя будет повреждена, поэтому здесь возможны ВНУТРЕННИЕ СОЕДИНЕНИЯ.
Потрясающие. Спасибо за ответ и решение. Это намного лучше, чем многочисленные запросы в цикле. Также к вашему комментарию выше, как только я использую переменную в этом запросе, я обязательно буду использовать bind ()!
Если вам нужны только строки с совпадающими строками в двух других таблицах, удалите ОСТАВИЛ в JOINS. Если это сработает, обязательно примите ответ.
@ethan, можно ли здесь использовать mysqli_store_result, а затем получать доступ к данным через fetch_assoc или fetch_row? Может быть, сохранить их как объекты для доступа к ним?
Вы можете извлечь все строки из запроса в связанный массив, а затем просмотреть их в цикле для вывода строк в вашей HTML-таблице. взгляните на mysqli_fetch_all
@billybutthead Вы можете извлекать данные из запроса, как вам нравится. Мой комментарий состоял в том, чтобы просто предположить, что ваш запрос является хорошим кандидатом для ВНУТРЕННИХ СОЕДИНЕНИЙ, а не для ЛЕВЫХ СОЕДИНЕНИЙ. INNER JOIN намного производительнее, чем LEFT JOIN.
Большое спасибо вам обоим! Хорошая копия внутри, а не слева.
Почему бы не использовать один запрос, объединяющий таблицы? Отредактируйте свой вопрос и добавьте схемы трех таблиц.