如何根据具有一对多关系的两个表中的位置进行搜索?

时间:2018-02-27 19:08:50

标签: php mysql sql pdo

我有两个表:userslocationusers中的列为:idnamelocation_id

location中的列为idcity

users.location_idlocation.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语句以选择具有相同位置的用户。

2 个答案:

答案 0 :(得分:1)

对于某个特定城市,您只需将users表加入位置表即可。

$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

答案 1 :(得分:0)

你的SQL查询应该看起来像这样:

SELECT * FROM users WHERE location_id IN (SELECT id FROM locations WHERE id='location_id_here')

对于此示例,您需要在执行此查询之前尝试查找的位置ID,但是如果您拥有该位置ID则应该有效。