过滤依赖数据表,从主表返回结果

时间:2015-01-27 12:15:50

标签: postgresql search sphinx

我可以在相关数据表中搜索,但是会从表中返回结果吗?

如果我们在数据库中有N x N关系,就会发生此问题,如下例所示:每个用户可以拥有多个位置,但即使用户位置很多,它仍然是一个自然人。

我想在表位置中查询带有条件的sphinx,并且返回集应该来自表用户

  

查询结果将按地理坐标GEODIST()进行过滤,但仅限于此   信息,因为它不是这个问题的主题。目标是   例如:从某个显式点找到位于20公里半径范围内的人

SQL结构

TABLE users
id PRIMARY KEY
name TEXT
etc...

TABLE locations
id PRIMARY KEY
name TEXT
coord_x FLOAT
coord_y FLOAT
etc...

TABLE user_location
user_id INTEGER FK
location_id INTEGER FK

当然我可以简单地在Sphinx sql_query中加入这3个表并过滤这个集合但是当人有多个位置时我得到重复的人

有关如何使用Sphinx Search实现此目标的任何提示?

3 个答案:

答案 0 :(得分:1)

  

当然我可以简单地在Sphinx sql_query中加入这3个表并过滤这个集合但是当人有多个位置时我会得到重复的人。

只需在sphinx查询中添加GROUP BY,然后每个用户只能获得自己的行。


您需要将users.id作为sphinx 属性(因此可以对其进行分组)并使用user_location中的主键作为sphinx文档ID(所以它的独特之处

(如果用户拥有位置,并且仍然希望能够搜索,那么会变得更复杂 - 没有位置过滤器。但它仍然可以完成。也许在索引上使用第二个源,以查找未定位的用户)

答案 1 :(得分:0)

SELECT DISTINCT u.*
FROM users u
JOIN user_location ul ON ul.user_id = u.id
JOIN locations l ON l.id = ul.location_id
WHERE ((l.coord_x - <<your X>>) * (l.coord_x - <<your X>>)) +
      ((l.coord_y - <<your Y>>) * (l.coord_y - <<your Y>>)) < 400;

您可能希望将其包装在SQL语言函数中,该函数将位置坐标作为参数,也可能是距离。请注意,此代码假定coord_x和coord_y以千米为单位。如果在某些其他单位中,请相应地更改值。

另请注意,查询不会通过取两个基本方向上的平方差的平方根来计算到给定点的距离:您对距离本身不感兴趣,但仅在距离指定距离较近的位置感兴趣从指定的点。所以你平方那个距离,然后忘记计算上昂贵的平方根。如果您的位置表有很多记录,您会注意到差异。

答案 2 :(得分:0)

SELECT *
FROM users u
WHERE EXISTS (
  SELECT * FROM user_location ul
  JOIN locations l ON l.id = ul.location_id
  WHERE ul.user_id = u.id
  AND l.coord_x ...
  AND l.coord_y ...
  );