我有一个关键字表(ID,EAN,关键字)和另一个包含产品详细信息的表。我希望搜索返回所有关键字至少匹配一次的EAN,但是我得到的最接近的是以下内容,但是这将返回其中包含第一个术语的匹配3次。

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

SQL Fiddle
我只想让EAN 1匹配,因此每个术语的匹配必须至少为1。

任何帮助将非常感激。

SELECT Count(keywords.ean)AS抄送,
           产品。*
FROM关键字
INNER JOIN产品
在products.ean = keyword.ean上
在哪里(
                      关键字LIKE'gen%'
                                 ||像“ ip%”这样的关键字
                                 ||关键字“ hea%”
GROUP BY(keywords.ean)
cc> = 3
订购`products.`ean` ASC


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

SELECT产品。*
从产品
INNER JOIN(SELECT ean,count(*)为tc1
                    FROM关键字
                    在哪里(“ gen%”之类的关键字)
                    分组依据
                    将tc1> 0)作为t1的t1.ean = products.ean
INNER JOIN(SELECT ean,count(*)为tc2
                    FROM关键字
                    WHERE(“ ip%”之类的关键字)
                    依分组
                    将tc2> 0)设为t2 ON t2.ean = products.ean
INNER JOIN(SELECT ean,count(*)为tc3
                    FROM关键字
                    在哪里(“ hea%”之类的关键字)
                    依分组
                    tc3> 0)as t3 ON t3.ean = products.ean
ORDER BY产品

最佳答案

也许您正在追求类似这样的东西...

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

关于mysql - 使用MySQL组中的like匹配所有关键字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44349830/

10-12 07:33