按匹配数量获取相关结果和订单

时间:2013-06-18 03:05:00

标签: mysql sql

我有很多像

这样的表
flyer        tagged     tags
-----------------------------------
id             tid       id
flyer_name     fid       tag_name

我目前正在标记的桌子上工作,我想要做的是选择所有相关结果并按匹配数量排序

让我说我有记录...... 表标记

tid  fid
---------
80    1
80    2
80    3
2     1
2     2
2     6
1     3
1     4
30    5
30    6

首先,我想选择所有tid为2或80的传单,然后通过fid对其进行分组所以它将返回fid 1,2,3

现在从1,2,3。我想通过在字段上使用CASE来完成所有这些,如果2或80然后+1变量'匹配',然后按匹配数排序所有fid,也返回属于传单的所有标签

Desired result
fid    matches    tags 
1         2       80,2      #matched with tags 80,2
2         2       80,2      #matched with tags 80,2
3         1       80,1      #matched with tags 80
6         1       2,30      #matched with tags 2

这是我当前的mysql代码无效,我试着尽可能简单地提出问题,如果你认为我应该提供更多,请告诉我。谢谢!

SELECT fid , tid , MATCHES FROM leon_tagged 
WHERE tid IN (2,80) 
CASE tid
    WHEN '2' then 1
    WHEN '80' then 1
    ELSE 0 END AS MATCHES
GROUP BY fid
ORDER BY MATCHES

1 个答案:

答案 0 :(得分:1)

试试这个。我认为不需要CASE声明。

SELECT T.fid
    , COUNT(T.tid) AS matches
    FROM tagged T
    WHERE T.tid IN (2, 80)
    GROUP BY T.fid
    ORDER BY matches DESC, T.fid ASC;

嘿,这是SQL Fiddle

中的一个测试

添加了tags字段:

SELECT T.fid
    , COUNT(T.tid) AS matches
    , GROUP_CONCAT(DISTINCT T.tid) AS tags
    FROM tagged T
    WHERE T.tid IN (2, 80)
    GROUP BY T.fid
    ORDER BY matches DESC, T.fid ASC;

但我担心你会得到不同的期望结果:

fid    matches    tags 
1         2       80,2      #matched with tags 80,2
2         2       80,2      #matched with tags 80,2
3         1       80        #matched with tags 80
6         1       2         #matched with tags 2

最后两行与您想要的不同,因为您之前已说明您只需要tags tid IN (2, 80)