0

2つのテーブルがあると想像してください

 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だけでできる限りのことをしたいと思っています。何か案は?私を正しい方向に向けるといいでしょう。

4

2 に答える 2

3

を使用して両方の列を結合し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デモ

于 2012-10-18T15:15:48.763 に答える
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
于 2012-10-18T15:24:54.863 に答える