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

Posted

技术标签:

【中文标题】如何根据具有一对多关系的两个表中的位置进行搜索?【英文标题】:How to search depending on location within two tables with one to many relation? 【发布时间】:2018-02-27 19:08:50 【问题描述】:

我有两张桌子: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语句来选择具有相同位置的用户。

【问题讨论】:

您能否再解释一下“具有相同位置的用户”是什么意思?也许举个例子?搜索输入是如何涉及的? @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中具有多个对应行的那些行

如何通过 Eloquent 中具有多对多关系的外部表中的列聚合进行分组?

根据一对多关系的值对集合进行排序

如何描述 Coq 中的一对多关系?