【问题标题】:Searching for id with most matches in separate keyword table在单独的关键字表中搜索匹配最多的 id
【发布时间】: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。 有任何想法吗?为我指明正确的方向会很好。

【问题讨论】:

    标签: php mysql search query-optimization


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多