gpt4 book ai didi

mysql - 获取相关结果并按匹配次数排序

转载 作者:行者123 更新时间:2023-11-29 00:29:45 24 4
gpt4 key购买 nike

我有一个多对多的表

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 if 2 or 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

最佳答案

试试这个。我认为不需要 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

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

关于mysql - 获取相关结果并按匹配次数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17159926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com