简单(?)MySQL查询

简单(?)MySQL查询,mysql,sql,Mysql,Sql,我是MySQL的新手,已经在一个查询上停留了一段时间。我原以为我必须使用子查询,但这样做不起作用,因为它返回多行。以下是到目前为止我得到的信息: SELECT im.fb_id, im.interest_id, i.name FROM interest_map AS im LEFT JOIN interests AS i ON i.id = im.interest_id WHERE i.category = 'Pet supplies' 这给了我所有对“宠物用品

我是MySQL的新手,已经在一个查询上停留了一段时间。我原以为我必须使用子查询,但这样做不起作用,因为它返回多行。以下是到目前为止我得到的信息:

    SELECT im.fb_id, im.interest_id, i.name
    FROM interest_map AS im
    LEFT JOIN interests AS i ON i.id = im.interest_id
    WHERE i.category = 'Pet supplies'
这给了我所有对“宠物用品”感兴趣的用户。我想做的是:

  • 从用户A开始
  • 收集用户A在类别X下的所有兴趣
  • 查找具有匹配兴趣的所有其他用户
  • 兴趣不需要显式匹配,这意味着用户A可以有兴趣1、2、4,用户B可以有兴趣2、3、5,并且他们仍然会在兴趣2上匹配

    我的桌子是这样的:

        users: id, firstname, last_name
        interests: id, name, category
        interest_map: user_id, interest_id
    

    另外,如果有人知道这种查询的名称,这样我就可以阅读其他类似的查询,我将非常感激

    那么,您应该读取数组中所有用户的兴趣。然后你可以做一个

    SELECT * FROM interest_map WHERE interest_id in (array of user A interests)
    
    如果你这样做,你还可以看到谁匹配使用A最多,这意味着你可以做A

    SELECT count(*) as nr, user_id FROM interest_map WHERE interest_id in (array of user A interests) GROUP BY user_id ORDER BY nr DESC.
    

    这将按降序为您提供与用户A最匹配的用户。

    您可以将第二个表中的条件移动到
    on
    子句中:

    SELECT im.fb_id, im.interest_id, i.name
    FROM interest_map im LEFT JOIN
         interests i
         ON i.id = im.interest_id AND
            i.category = 'Pet supplies';
    
    左联接
    与记录不匹配时,它会生成一个
    NULL
    值。因此,当您说
    i.cateogry='Pet Supplies'
    时,
    i.category
    的值为
    NULL
    ,比较失败

    将条件放在
    on
    子句中可以解决此问题。但是,它将保留初始表中的所有行

    我想你真的想要:

    SELECT u.id, im.interest_id, i.name
    FROM users u left outer join
         interest_map im
         on u.id = im.user_id LEFT JOIN
         interests i
         ON i.id = im.interest_id AND
            i.category = 'Pet supplies';
    

    这将为每个用户生成一行,并具有适当的兴趣。

    注意,WHERE子句有效地将外部联接呈现为内部联接。哦,它被称为一个简单连接。我之前把它作为一个内部连接,但我试着离开,只是想看看我的结果集是否发生了变化(注意,我使用SQL已经有一两周了)。我真的只需要将用户A的所有兴趣映射到表中每个其他人都具有的匹配兴趣,但我不知道要使用哪种类型的连接。因为这就是连接的用途!视情况而定,如果他已经有兴趣,并且在现实生活中他应该已经有了兴趣,那么这个
    从兴趣地图中选择*,其中兴趣id在(用户兴趣数组)
    中比加入更快。我同意,子查询是不必要的。您在解决方案末尾建议的子查询的SELECT不合适,它为我提供了用户的所有兴趣,而不仅仅是匹配的兴趣。理想情况下,我需要一个如下表:
    user | interest name/id
    ,其中显示了所有用户,他们也喜欢用户a选择的类别中的相同内容。@我看到您删除了上一条评论。对我来说,这个
    SELECT*来自tblProductCategoryRelation\u PCAR,其中idPCAT\u PCAR IN(8151231)
    以0.004秒的速度运行,这个
    SELECT second.*来自tblProductCategoryRelation\u PCAR首先加入tblProductCategoryRelation\u PCAR second.idpcar其中first.idPRD\u PCAR=945
    以0.011秒的速度运行。我知道,我知道,命名惯例。。。旧数据库。(不确定这是否回答了问题!?!?)是否有方法删除包含空列的行?这更接近我想要达到的目标。您提出的两个查询都返回空列的结果。切换到内部联接将删除空列(我现在得到了内部联接与左联接,万岁!)。最后一项是过滤掉任何不匹配的兴趣列。如我在问题中所述,用户A喜欢事物1、2和4,而用户B喜欢事物2、3和5。查询结果应仅显示两行:
    User A|2
    User B|2