Php 在单独的关键字表中搜索最匹配的id
假设你有两张桌子Php 在单独的关键字表中搜索最匹配的id,php,mysql,search,query-optimization,Php,Mysql,Search,Query Optimization,假设你有两张桌子 table: name table: keyword id name nameId keyword 1 dude1 1 blue 2 dude2 1 tall 2 blue 2 short 我的目标是,如
table: name table: keyword
id name nameId keyword
1 dude1 1 blue
2 dude2 1 tall
2 blue
2 short
我的目标是,如果你搜索蓝色和高大,结果将是:
name matches
dude1 2
dude2 1
我也在使用PHP,但我想用MySQL做尽可能多的事情。
有什么想法吗?将我指向正确的方向会很好。您需要使用
内部联接连接两个列(如果您只希望另一个表上至少有匹配项的记录,则使用左联接连接),并将它们链接到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
或
您需要使用internal 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
或
通过按名称分组,您假定该名称是唯一的,而通常情况下它不是唯一的,或者不需要id。@Clodoaldo如果您不将它们分组,则在返回后您将只有1条记录execution@Clodoaldo如果你不把他们分组,看看他们的名字是什么unique@Clodoaldo很公平。op没有提到它。通过按名称分组,您假设它是唯一的,而通常情况下它不是唯一的,或者不需要id。@Clodoaldo如果您不将它们分组,则在返回后您将只有1条记录execution@Clodoaldo如果你不把他们分组,看看他们的名字是什么unique@Clodoaldo很公平。行动组什么也没说。
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