2014-10-19 72 views
0

Fiddle Example查找谁喜欢特定产品在MySQL的人最喜欢的产品

我想知道如何从谁喜欢的产品H135与下表架构的用户找出最喜欢的产品:

CREATE TABLE likes 
    (`user_id` int,`product_id`int) 
; 

INSERT INTO likes 
    (`user_id`,`product_id`) 
VALUES 
    (1,22), 
    (1,44), 
    (2,33), 
    (2,44), 
    (3,22), 
    (3,55), 
    (4,44), 
    (4,11), 
    (5,22), 
    (5,44), 
    (5,33) 

; 
CREATE TABLE products 
    (`product_id` int,`product_name`varchar(30)) 
; 

INSERT INTO products 
    (`product_id`,`product_name`) 
VALUES 
    (11,'N570'), 
    (22,'KA89'), 
    (33,'A321'), 
    (44,'H135'), 
    (55,'C839') 
; 

预期的输出应该是这样的

Liked_product users_who_like_it_also_like  Result 
H135   KA89       3 

我试图self join但它不”牛逼取得任何结果:

SELECT p.product_name,p2.product_name AS other_liked_products, 
COUNT(l2.product_id) AS users_who_like_it_also_like 
FROM likes l 
INNER JOIN products p ON p.product_id = l.product_id 
INNER JOIN likes l2 ON l.product_id = l2.product_id 
INNER JOIN products p2 ON p2.product_id = l2.product_id 
WHERE l.product_id = 44 
AND l2.product_id <> 44 
GROUP BY l.product_id 
LIMIT 1 
+0

你可能只需要一个'为了by'后声明'由...组'。 – 2014-10-19 20:42:35

回答

2

如果你不关心的关系,你可以使用:

select 'H135' as liked_product, 
     p.product_name as users_who_like_it_also_like, 
     count(*) as result 
    from likes l 
    join products p 
    on p.product_id = l.product_id 
where exists (select 1 
      from likes x 
     where x.user_id = l.user_id 
      and x.product_id = 44) 
    and l.product_id <> 44 
group by p.product_name 
order by 3 desc 
limit 1 

小提琴:http://sqlfiddle.com/#!2/27d573/17/0

在您的样本数据KA89实际上有计数2并与A321并列。

这将在汇总表上一行与计数2被捆绑同时显示:

select liked_product, 
     group_concat(users_who_like_it_also_like) as users_who_like_it_also_like, 
     result 
    from (select 'H135' as liked_product, 
       p.product_name as users_who_like_it_also_like, 
       count(*) as result 
      from likes l 
      join products p 
      on p.product_id = l.product_id 
     where exists (select 1 
        from likes x 
       where x.user_id = l.user_id 
        and x.product_id = 44) 
      and l.product_id <> 44 
     group by p.product_name) x 
group by liked_product, result 
order by result desc limit 1 

小提琴:http://sqlfiddle.com/#!2/27d573/19/0