Mysql 按匹配数获取相关结果和顺序

Mysql 按匹配数获取相关结果和顺序,mysql,sql,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

我有一张多对多的桌子

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开始。我想通过使用tid字段上的CASE(如果是2或80),然后+1到变量'matches',然后根据匹配数对所有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

试试这个。我认为没有必要使用
案例
语句

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;
嘿,这里有个测试

添加了
标记
字段:

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

最后两行与您想要的不同,因为您在前面已经说过,您只想要(2,80)中带有
tid的
标记

试试这个。我认为没有必要使用
案例
语句

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;
嘿,这里有个测试

添加了
标记
字段:

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

最后两行与您想要的不同,因为您在前面已经说过,您只想要(2,80)
中带有
tid的
标记

是否可以使用大小写并形成一个标记字符串。是指结果fid,2,3作为其他变量?我试着让每件事都由一个人来完成,这是可能的。给我一分钟。@LeonArmstrong,你能编辑你的问题来提供你真正想要的标签串吗?我想看到期望的输出。很抱歉,我应该花更多的精力来解释这一点,更新我的问题,实际上所有的标签都属于特定的FlyerHanks dude,你已经为我做了太多了,我正在使用嵌套连接来获得它,答案是如此简单和容易理解!是否可以使用大小写并形成一个标记字符串。是指结果fid,2,3作为其他变量?我试着让每件事都由一个人来完成,这是可能的。给我一分钟。@LeonArmstrong,你能编辑你的问题来提供你真正想要的标签串吗?我想看到期望的输出。很抱歉,我应该花更多的精力来解释这一点,更新我的问题,实际上所有的标签都属于特定的FlyerHanks dude,你已经为我做了太多了,我正在使用嵌套连接来获得它,答案是如此简单和容易理解!