#php #mysqli
#php #mysqli
Вопрос:
Из кода я хочу, чтобы эти 2 таблицы (личная и информационная) сравнивали, имеет ли он одинаковое местоположение или нет. Если есть совпадение, я хочу отобразить данные из личной таблицы, как указано в комментарии.
$selectall = "SELECT * FROM information";
$stmt = mysqli_query($connection, $selectall);
$compare = "SELECT * FROM personal INNER JOIN information ON personal.location = information.location";
$comparing = mysqli_query($connection, $compare);
while($row = mysqli_fetch_array($stmt)) {
$output .= '<tr>
<td>' .$row['name']. '</td>
<td>' .$row['location']. '</td>
<td>' .$row['postal']. '</td>
</tr>
<tr>
<td>//This is where I want to show the matched data from personal table</td>
</tr>';
}
Комментарии:
1. Что не так с тем, что вы написали?
2.
$row
будет содержать данные из совпадающих строк в обеих таблицах.3. хорошо, и как отобразить данные из другой таблицы?
4. в цикле while я вычисляю только $stmt. возможно ли получить данные из $comparing ?
5. Используйте
mysqli_fetch_array($comparing)
. В этом нет необходимости$stmt
вообще.
Ответ №1:
Я думаю, что вам нужны результаты $comparing
запроса, а не $selectall
.
Если вы хотите, чтобы возвращались определенные столбцы, SQL можно манипулировать, чтобы возвращать только необходимые столбцы. например:
SELECT column_from_information, other_column_you_want, personal.location FROM personal INNER JOIN information ON personal.location = information.location
Идея в том, что вы можете определять столбцы с добавленными именами таблиц, т.е. personal.name , информация.местоположение и т. Д.
while($row = mysqli_fetch_array($comparing)) {
$output .= '<tr>
<td>' .$row['name']. '</td>
<td>' .$row['location']. '</td>
<td>' .$row['postal']. '</td>
</tr>
<tr>
<td><!--Matched Data--></td>
</tr>';
}
Комментарии:
1. .$row[‘name’]. , .$row[‘location’]. , .$row[‘postal’] на самом деле из таблицы «информация». Я хочу отобразить обе таблицы внутри цикла while. Как я могу это сделать?
2. вы имеете в виду столбцы из обеих таблиц? какие столбцы нужны?
3. Правильная переменная
$comparing
, not$compare
.4. местоположение из личной таблицы
5. @nzrnfourtwenty Местоположение from
personal
совпадает с местоположением frominformation
, потому что в запросе указаноON personal.location = information.location
Ответ №2:
Если вы хотите получить все information
, даже если в нем нет совпадения personal
, используйте внешнее соединение. Для строк, которые не имеют совпадения, столбцы из personal
будут содержать null
.
Вы должны явно выбрать нужные столбцы. Если вы используете SELECT *
и в обеих таблицах есть столбцы с одинаковыми именами, $row['columnname']
получает значение из второй таблицы, которое будет null
, когда совпадения не будет. Поскольку вам нужно значение из первой таблицы, выберите его специально.
$compare = "SELECT i.name, i.location, i.postal, p.somecolumn, p.anothercolumn FROM information AS i
LEFT JOIN personal AS p
ON p.location = i.location";
$comparing = mysqli_query($compare);
while ($row = mysqli_fetch_assoc($comparing)) {
$output .= '<tr>
<td>' .$row['name']. '</td>
<td>' .$row['location']. '</td>
<td>' .$row['postal']. '</td>
</tr>
<tr>
<td>' . $row['somecolumn'] . '</td>
<td>' . $row['anothercolumn'] . '</td>
</tr>';
}
Комментарии:
1. сейчас я запутался. Хорошо, прежде всего, я хочу отобразить все данные из информационной таблицы и (с) все сопоставленные данные (в зависимости от местоположения) из личного прямо под строкой информационных данных в $output. Если нет других данных, которые соответствуют (personal.location = информация. местоположение), пустой результат из личного должен отображаться, а не данные из информации
2. исправление: если нет других данных, которые соответствуют (personal.location = информация. местоположение), должен появиться пустой результат из личного . Потому что прямо сейчас, когда я использую left join, данные из information не отображаются
3. * данные из information не отображаются, если есть несоответствие
4. к вашему сведению, обе таблицы имеют только одно и то же имя столбца, которое является «местоположением»
5. Если вы сделаете это так, как я показал, данные из
information
должны отображаться. Вы не можете использоватьSELECT *
, потому что тогда одно и то же имя столбцаlocation
получит данные изpersonal
, а неlocation
, и когда совпадения не будет, оно будет пустым.