在单独的关键字表中搜索匹配最多的 id
Posted
技术标签:
【中文标题】在单独的关键字表中搜索匹配最多的 id【英文标题】:Searching for id with most matches in separate keyword table 【发布时间】:2012-10-18 15:13:42 【问题描述】:假设你有两张桌子
table: name table: keyword
id name nameId keyword
1 dude1 1 blue
2 dude2 1 tall
2 blue
2 short
我的目标是,如果您搜索 blue and tall,结果将是:
name matches
dude1 2
dude2 1
我也在使用 php,但我想尽可能多地使用 mysql。 有任何想法吗?为我指明正确的方向会很好。
【问题讨论】:
【参考方案1】:您需要使用INNER JOIN
连接两列(如果您只想要在另一个表上至少匹配的记录,否则使用LEFT JOIN
)并将它们与name.id = keyword.nameid
链接起来.使用聚合函数COUNT
并按名称分组。
SELECT a.name, COUNT(b.nameID)
FROM name a INNER JOIN keyword b
on a.id = b.nameID
WHERE b.keyword = 'tall' or
b.keyword = 'blue'
GROUP BY a.name
或
SELECT a.name, COUNT(b.nameID)
FROM name a INNER JOIN keyword b
on a.id = b.nameID
WHERE b.keyword IN ('tall','blue')
GROUP BY a.name
SQLFiddle Demo
【讨论】:
通过按名称分组,您假设它是唯一的,通常它不是唯一的,或者不需要 id。 @Clodoaldo 如果不分组,执行后只会返回 1 条记录 @Clodoaldo see this example 如果你不分组他们 名字不唯一的时候看what happens @Clodoaldo 很好,很公平。操作人员没有对此说任何话。【参考方案2】:select n.name, `matches`
from
name n
inner join (
select id, count(*) as `matches`
from
name n
inner join
keyword k on n.id = k.nameId
where keyword in ('blue', 'tall')
group by id
) s on s.id = n.id
order by name
【讨论】:
以上是关于在单独的关键字表中搜索匹配最多的 id的主要内容,如果未能解决你的问题,请参考以下文章