У меня есть два таких запроса:

$stm = $db->prepare(" SELECT * from table1 where word = :word ");
$stm->bindValue(':word', $word, PDO::PARAM_STR);
$stm->execute();

$iterator = 0;
while ($end = $stm->fetch()) {

    foreach ($db-query(" SELECT * from table2 where id = $end['id']") as $row) {
        echo $row['title'];
    }

    $iterator ++;
}

Теперь я хочу знать, можно ли написать подзапрос вместо этого отдельного запроса? Другими словами, как я могу написать эти два запроса в одном запросе?

0
Shafizadeh 29 Дек 2015 в 16:04

4 ответа

Лучший ответ

Ответ на ваш вопрос заключается в том, что вы можете сделать это в базе данных. И ты должен.

Типичный ответ - вы должны выучить join. Однако в этом случае более уместно in или exists:

select t2.*
from table2 t2
where t2.id in (select id from table1 where word = :word);

Я нахожу удивительным, что условие, соединяющее две таблицы, находится в столбце с именем id в обеих таблицах.

2
Gordon Linoff 29 Дек 2015 в 13:09

Вы можете использовать для этого соединение, взгляните на этот запрос

    SELECT table1.id, table2.title
    FROM table1
    INNER JOIN table2
    ON table1.id=table2.id;
    WHERE word = :word

Вы можете узнать больше о присоединениях здесь

1
Ahmed Khan 29 Дек 2015 в 13:08

Конечно, вы можете использовать INNER JOIN

$stm = $db->prepare(" SELECT t2.* from 
                       table1 t1  INNER JOIN table2 t2 ON (t2.id = t1.id) 
                       WHERE t1.word = :word "); 
$stm->bindValue(':word', $word, PDO::PARAM_STR);
$stm->execute();

$iterator = 0;
while ($row = $stm->fetch()) {
   echo $row['title'];
   $iterator ++;
}
1
Shafizadeh 29 Дек 2015 в 13:50

JOIN - ваше решение?

SELECT main.*, joinedTable.* FROM T1 as main
LEFT JOIN T2 as joinedTable
ON main.id=joinedTable.id
WHERE main.word = :word

Я не пробовал ...

1
Max Bongiorno 29 Дек 2015 в 13:10