按列分组数据库行的有效方法?

时间:2017-03-24 15:31:22

标签: python algorithm postgresql

假设我正在建立一个约会应用程序,根据用户的约会目标为用户提供建议。假设用户在数据库中表示如下:

       Column        |            Type                                     
---------------------+-----------------------------
 id                  | bigint
 updated_since       | timestamp
 goal                | text

让我们说goal的值可以是四件事之一:

  1. seeking_sugar_daddy
  2. seeking_sugar_mama
  3. be_sugar_daddy
  4. be_sugar_mama
  5. 现在,假设我有一个定期运行的推荐引擎,并根据目标和其他一些标准(身高,年龄等)为所有用户生成匹配。推荐引擎将一对用户作为输入并生成分数。

    生成推荐引擎输入列表的最有效方法是什么?唯一有效的输入是具有匹配目标的对 - 例如,如果User A具有目标seeking_sugar_daddy,并且User B具有将成为有效输入的目标be_sugar_daddy,但seeking_sugar_daddybe_sugar_mama不是有效的一对。

    一旦我从数据库中获取所有用户,我应该如何对它们进行分组?或者有没有办法在数据库中执行此操作?

2 个答案:

答案 0 :(得分:1)

您需要relationship表来配置属性。 (当然你使用id没有文字)

  atributeA             |  atributeB
  --------------------------------------------
  seeking_sugar_daddy   |  be_sugar_daddy
  be_sugar_daddy        |  seeking_sugar_daddy
  ....

然后你匹配这样的用户

 SELECT *
 FROM users u1
 JOIN relationship r
   ON u1.goal = r.atributeA
 JOIN users u2
   ON r.attributeB = u2.goal

注意:这允许您稍后添加更多属性,而不是硬编码查询条件。

此外,我复制/反转关系以使who are the match for 'UserA'之类的搜索更容易。但如果您只想要所有用户匹配,请不要复制。

答案 1 :(得分:0)

让我们将您的目标缩写为"A""C""G""T",其中A匹配T,C匹配G.以下是您的匹配:

SELECT * from users AS a JOIN users AS b 
ON (a.goal = "A" AND b.goal = "T") OR (a.goal = "C" and b.goal = "G")

请注意,由于左侧和右侧显示相同的表格,因此无需检查a.goal = "T"等。