2012-10-18 33 views
0

想象一下,你有两个表在单独的关键字表最匹配搜索ID

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。 任何想法?指出我朝着正确的方向会很好。

回答

3

你需要使用INNER JOIN如果你只想记录就是它是对其他表ATLEAST匹配,否则使用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

+0

由你所假设它的名字分组是独特的,其在总体上是不是还是不会有一个ID的需要。 –

+0

@Clodoaldo如果你不分组他们,你将只有1个记录返回执行 –

+0

@Clodoaldo [看这个例子](http://sqlfiddle.com/#!2/bd9b4/9),如果你不分组他们 –

0
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