我有很多像
这样的表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
答案 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)
。