Как сопоставить столбец из 2 разных таблиц с помощью php

#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 совпадает с местоположением from information , потому что в запросе указано 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 , и когда совпадения не будет, оно будет пустым.