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