【问题标题】:Match all keywords using like in group MySQL在 MySQL 组中使用 like 匹配所有关键字
【发布时间】:2017-11-05 02:22:21
【问题描述】:

我有一个关键字表(ID、ean、keyword)和另一个包含产品详细信息的表。我希望搜索返回所有关键字至少匹配一次的 EAN,但是我得到的最接近的是以下内容,但这会返回包含第一个词的匹配项,例如 3 次。

举个例子,假设我有一个名为“通用耳机 - iPhone、iPad、iPod”的产品,我搜索了 'gen%' 'hea%' 'ip%' 它会作为匹配项返回,但它由于 3 个 ip 词,它也将匹配“Apple 耳机 - iPhone、iPad、iPod”,这是不希望的。

SQL Fiddle 我希望 EAN 1 仅匹配,因此每个术语的匹配项至少需要 1 个。

任何帮助将不胜感激。

选择计数(keywords.ean)作为抄送, 产品。* FROM 关键字 内连接产品 ON products.ean = 关键字.ean 在哪里 ( 关键字 LIKE 'gen%' ||像'ip%'这样的关键字 ||关键字 LIKE 'hea%') 分组依据(keywords.ean) 有 cc>=3 ORDER BY `products`.`ean` ASC

更新:这会得到预期的结果,但必须有更有效的方法来做到这一点。

选择产品。* 来自产品 INNER JOIN (SELECT ean, count(*) as tc1 FROM 关键字 WHERE(关键字如 'gen%' ) 分组 HAVING tc1 > 0 ) as t1 ON t1.ean = products.ean INNER JOIN (SELECT ean, count(*) as tc2 FROM 关键字 WHERE(关键字如 'ip%' ) 分组 HAVING tc2 > 0 ) as t2 ON t2.ean = products.ean INNER JOIN (SELECT ean, count(*) as tc3 FROM 关键字 WHERE(关键字如 'hea%' ) 分组 HAVING tc3 > 0 ) as t3 ON t3.ean = products.ean 按产品订购.ean

【问题讨论】:

标签: mysql


【解决方案1】:

也许你在追求类似的东西......

SELECT p.ean
     , p.description
  FROM products p 
  JOIN keywords k 
    ON k.ean = p.ean
 WHERE k.keyword LIKE 'iP%'  
    OR k.keyword LIKE 'hea%' 
    OR k.keyword LIKE 'gen%' 
 GROUP
    BY p.ean
HAVING COUNT(DISTINCT CASE WHEN k.keyword LIKE 'iP%' THEN 'iP' 
                           WHEN k.keyword LIKE 'hea%' THEN 'hea'
                           WHEN k.keyword LIKE 'gen%' THEN 'gen'
                           ELSE keyword END) = 3; 

http://sqlfiddle.com/#!9/270f9/25

【讨论】:

    【解决方案2】:

    这就是我在 PostgreSQL 中的做法。 MySQL 的语法可能略有不同。

    SELECT kc.cc AS cc,
           products.*
    FROM products
    INNER JOIN (  SELECT ean, count(*) AS cc 
                        FROM keywords
                        WHERE ( keyword like 'ip%' 
                               OR keyword like 'ai%'
                               OR keyword like 'bei%' )
                        GROUP BY ean
                        HAVING count(*) >= 3 ) AS kc
           ON kc.ean = products.ean
    ORDER BY Products.ean;
    

    【讨论】:

      猜你喜欢
      • 2012-09-20
      • 2015-03-03
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多