1

我有一个多对多的桌子,比如

flyer        tagged     tags
-----------------------------------
id             tid       id
flyer_name     fid       tag_name

我目前在 tagged 表工作,我想做的是选择所有相关结果并按匹配数排序

可以说我有记录...表已标记

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 if 2 或 80 上使用 CASE 然后 +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
4

1 回答 1

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)

于 2013-06-18T03:14:53.367 回答