如何根据具有一对多关系的两个表中的位置进行搜索?
Posted
技术标签:
【中文标题】如何根据具有一对多关系的两个表中的位置进行搜索?【英文标题】:How to search depending on location within two tables with one to many relation? 【发布时间】:2018-02-27 19:08:50 【问题描述】:我有两张桌子:users
和 location
。 users
中的列是:id
、name
和 location_id
。
location
中的列是id
和city
。
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语句来选择具有相同位置的用户。
【问题讨论】:
您能否再解释一下“具有相同位置的用户”是什么意思?也许举个例子?搜索输入是如何涉及的? @Don'tPanic ,例如我有两个用户 jack 和 john ,它们的 location_id = 1 例如是纽约,我想在输入 new 时显示这两个用户纽约 好的。所以你想显示特定位置的所有用户?或者您的查询是否可能返回多个位置,并且您希望获取每个位置的所有用户? @Don'tPanic,第一种情况,每次只有一个位置 【参考方案1】:对于一个特定的城市,您只需将 users 表连接到 location 表即可。
$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
。
【讨论】:
【参考方案2】:您的 SQL 查询应该如下所示:
SELECT * FROM users WHERE location_id IN (SELECT id FROM locations WHERE id='location_id_here')
对于本示例,在执行此查询之前,您需要尝试查找的位置 ID,但如果您有它应该可以工作。
【讨论】:
以上是关于如何根据具有一对多关系的两个表中的位置进行搜索?的主要内容,如果未能解决你的问题,请参考以下文章
工作中Mabatis问题记录-两个实体具有一对多关系,根据一那个实体进行分页
如何使用 ADO.NET 从具有一对多关系的 DAL 层中的多个表中返回数据
在一对多关系表中,仅从表A中获得在表B中具有多个对应行的那些行