简单(?)MySQL查询
我是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' 这给了我所有对“宠物用品
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'
这给了我所有对“宠物用品”感兴趣的用户。我想做的是:
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