У меня две таблицы: users
и location
. В столбцах users
: id
, name
и location_id
.
Столбцы в location
- это id
и city
.
Между users.location_id
двумя таблицами (от одного до многих) существует связь между users.location_id
и location.id
.
Я хочу показать пользователям, которые имеют одинаковое расположение.
Например:
<input type='text' name='search_input' />
$search_input = $_POST["search_input"];
$stmt = $pdo->prepare('SELECT * from users WHERE ... LIKE :s');
$stmt->bindValue(':s', '%' . $search_input . '%' , PDO::PARAM_STR);
$stmt->execute();
$values = $stmt->fetchAll();
Я хочу заполнить инструкцию sql, чтобы выбрать пользователей, имеющих одно и то же местоположение.
Для одного конкретного города вы можете просто присоединиться к таблице пользователей в таблице местоположений.
$sql = 'SELECT *
FROM users JOIN location ON users.location_id = location.id
WHERE city = ?';
$stmt = $pdo->prepare($sql);
$stmt->execute([$search_input]);
$values = $stmt->fetchAll();
То, как вы делаете это сейчас, с LIKE
, может возвращать более одного города, тем не менее, поэтому вы можете добавить некоторую сортировку в свой запрос для организации результатов.
$sql = 'SELECT *
FROM users JOIN location ON users.location_id = location.id
WHERE city LIKE ?
ORDER BY city.name, users.name';
$stmt = $pdo->prepare($sql);
$stmt->execute(["%$search_input%"]);
$values = $stmt->fetchAll();
Если вы не хотите (возможно) сопоставлять более одного места, вы должны использовать =
а не LIKE
.
Вероятно, ваш SQL-запрос должен выглядеть примерно так:
SELECT * FROM users WHERE location_id IN (SELECT id FROM locations WHERE id='location_id_here')
В этом примере вам понадобится идентификатор местоположения, который вы пытаетесь найти, прежде чем выполнять этот запрос, но если у вас есть это, он должен работать.