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

2024-04-30 04:24:28 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我正在构建一个约会应用程序,根据用户的约会目标生成推荐。假设用户在数据库中是这样表示的:

       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

现在,假设我有一个定期运行的推荐引擎,它根据目标和其他一些标准(身高、年龄等)为所有用户生成匹配项。推荐引擎将一对用户作为输入并生成分数。你知道吗

生成推荐引擎输入列表的最有效方法是什么?唯一有效的输入是具有匹配目标的对-例如,如果User A有一个目标seeking_sugar_daddyUser B有一个目标be_sugar_daddy,这将是一个有效的输入,但是seeking_sugar_daddybe_sugar_mama将不是一个有效的对。你知道吗

一旦我从数据库中获取了所有用户,我应该如何对他们进行分组?或者有没有办法在数据库中这样做?你知道吗


Tags: 用户引擎数据库应用程序目标typecolumnbe
2条回答

您需要一个relationship表来配对属性。(当然您使用的是ids no text)

  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'的搜索更容易。但是,如果您只需要所有的用户匹配,就不需要复制。你知道吗

让我们将您的目标缩写为"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"

相关问题 更多 >