Sua primeira consulta SQL está bem, mas para a segunda, você só quer selecionar as imagens para a postagem atual (linha) no loop while externo, então a segunda consulta SQL deve ser:
"SELECT img_file, img_title FROM images WHERE post_id = $row[id_post]"
Atualização para mostrar apenas img3 de post1:
<!DOCTYPE html>
<html>
<body>
<?php
$db = mysqli_connect("localhost", "root", "", "post_images");
$result = mysqli_query($db, "SELECT * FROM posts");
while ($row = mysqli_fetch_array($result)) {
echo "<div class=\"post_container\">";
echo $row['post_title'];
echo "<div class=\"image_container\">";
if ($row['id_post'] == 1) {
$resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id = " .$row['id_post']. " AND img_title = 'img3'");
} else {
$resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id = " .$row['id_post']);
}
if(mysqli_num_rows($resultx) > 0) {
while ($rowx = mysqli_fetch_array($resultx)) {
echo "<img src='../folder_image_uploads/".$rowx['img_file']."' >";
echo $rowx['img_title'];
}
}
echo "</div>";
echo "</div>";
}
?>
</body
</html>
Coloquei a segunda consulta SQL em uma instrução if, que verifica se o id da postagem atual é igual a 1. Se for, a consulta SQL seleciona apenas a linha com "img3". (E se não for, ele executa a consulta SQL anterior que seleciona todas as linhas.)
Claro que isso só funciona se você souber o id da postagem e o título da imagem que deseja exibir. Uma solução mais genérica para sempre exibir apenas a terceira imagem do primeiro post seria algo assim:
<!DOCTYPE html>
<html>
<body>
<?php
$db = mysqli_connect("localhost", "root", "", "post_images");
$result = mysqli_query($db, "SELECT * FROM posts ORDER BY id_post");
$rows = mysqli_fetch_all($result,MYSQLI_ASSOC);
foreach ($rows as $key => $value)
echo "<div class=\"post_container\">";
echo $row['post_title'];
echo "<div class=\"image_container\">";
if ($key == 0) {
$resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id = " .$row['id_post']. " ORDER BY id_img LIMIT 1 OFFSET 2");
} else {
$resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id = " .$row['id_post']);
}
if(mysqli_num_rows($resultx) > 0) {
while ($rowx = mysqli_fetch_array($resultx)) {
echo "<img src='../folder_image_uploads/".$rowx['img_file']."' >";
echo $rowx['img_title'];
}
}
echo "</div>";
echo "</div>";
}
?>
</body
</html>
Aqui eu armazenei todo o resultado da primeira consulta SQL em um array, pois então as chaves do array correspondem ao número de cada post menos um. Se $key =0, a linha atual é a primeira postagem e então usamos a consulta SQL que seleciona apenas a terceira imagem da tabela de imagens. Se $key não for 0, usamos a outra consulta SQL que seleciona todas as imagens.
Na nova consulta SQL, LIMIT 1 significa selecionar apenas 1 linha e OFFSET 2 significa iniciar com a linha 3 (a contagem começa em 0, portanto, o deslocamento 2 retorna a linha 3).
Adicionei ORDER BY id_img para garantir que as imagens sejam sempre retornadas na mesma ordem, a ordem em que foram adicionadas ao banco de dados. (E eu fiz o mesmo com id_post na primeira consulta.)