MySQL查询和条件

MySQL查询和条件,mysql,Mysql,我有一个结构和数据如下的表格: 类别:有许多子类别 子类别:属于:类别 我正在这两个表中搜索。我的搜索关键字是“巧克力和饼干”。这将在子类别表中搜索,并返回子类别的类别。第2行有“巧克力”一词,第3行有“饼干”,但这两个子类别属于同一类别,因此应返回第2个类别。但是我下面的查询只返回我的第一个类别 SELECT cat.id,cat.category_name,sub.sub_category_name FROM categories cat JOIN sub_categories sub

我有一个结构和数据如下的表格:

  • 类别:有许多子类别
  • 子类别:属于:类别
  • 我正在这两个表中搜索。我的搜索关键字是“巧克力和饼干”。这将在子类别表中搜索,并返回子类别的类别。第2行有“巧克力”一词,第3行有“饼干”,但这两个子类别属于同一类别,因此应返回第2个类别。但是我下面的查询只返回我的第一个类别

    SELECT cat.id,cat.category_name,sub.sub_category_name 
    FROM categories cat JOIN sub_categories sub 
    WHERE cat.id = sub.category_id and sub.sub_category_name REGEXP '[[:<:]]Chocolate[[:>:]]' AND sub.sub_category_name REGEXP '[[:<:]]Cookies[[:>:]]'
    
    选择类别id、类别名称、子类别名称
    从类别cat JOIN sub_categories sub
    其中cat.id=sub.category_id和sub.sub_category_name REGEXP'[[::]]和sub.sub_category_name REGEXP'[[:::]]
    
    任何人,请建议如何做到这一点


    提前感谢

    问题是只有第一个子类别中既有
    巧克力
    又有
    饼干
    ,第二个子类别中只有
    巧克力
    。由于
    ,这两个关键字必须出现在相同的
    子类别名称
    字段中。提醒一下:第三条记录将不匹配任何搜索,因为它包含单词
    cookie
    ,但您正在搜索
    cookie

    最简单的解决方案是使用
    而不是

    SELECT cat.id,cat.category_name,sub.sub_category_name 
    FROM categories cat INNER JOIN sub_categories sub 
    on cat.id = sub.category_id 
    where sub.sub_category_name REGEXP '[[:<:]]Chocolate[[:>:]]' OR sub.sub_category_name REGEXP '[[:<:]]Cookies[[:>:]]'
    
    全文搜索:

    SELECT cat.id,cat.category_name,sub.sub_category_name 
    FROM categories cat INNER JOIN sub_categories sub 
    on cat.id = sub.category_id 
    where match(sub.sub_category_name) against ('chocolate cookies' in Boolean mode)
    

    只需确保您熟悉全文搜索限制(最小字长、停止词、鼻子等)和功能。

    如果我理解正确,您的要求可以解释为查找子类别同时匹配巧克力和饼干关键字的类别。 你可以试试

    SELECT cat.id, 
           cat.category_name 
    FROM   categories cat 
    WHERE  EXISTS (SELECT 1 
                   FROM   sub_categories sub1 
                   WHERE  cat.id = sub1.category_id 
                          AND sub1.sub_category_name LIKE '%Chocolate%') 
           AND EXISTS (SELECT 1 
                       FROM   sub_categories sub2 
                       WHERE  cat.id = sub2.category_id 
                              AND sub2.sub_category_name LIKE '%Cookies%')
    
    如果要获取子类别的信息,可以更新查询以与表子类别联接。

    您可以这样做:

    SELECT cat.id, cat.category_name, GROUP_CONCAT(scat.sub_category_name ORDER By 
      scat.sub_category_name) AS sub_category
    FROM categories AS cat
    LEFT JOIN sub_categories AS scat ON scat.category_id = cat.id
    WHERE scat.sub_category_name LIKE '%Chocolate%' OR scat.sub_category_name LIKE '%Cookie%'
    GROUP BY cat.id
    

    和fiddle对要求的解释不同,但可能同样正确。如果你对你的查询做了一些解释,那么这将得到我的投票。你想获取所有匹配子类别的类别名称吗?是的,我想获取类别。那么我随答案附上的fiddle链接如何。是否可以?我无法在此场景中使用或设置条件。如果我的搜索关键字是“巧克力或饼干”,那么我可以使用它或条件。但是我的身体和状况完全不同。它应该作为布尔运算符工作search@SuriyaPrabha根据您的数据样本,您想要的输出应该只包含类别2或两者。我需要两者
    SELECT cat.id,cat.category_name,sub.sub_category_name 
    FROM categories cat INNER JOIN sub_categories sub 
    on cat.id = sub.category_id 
    where match(sub.sub_category_name) against ('chocolate cookies' in Boolean mode)
    
    SELECT cat.id, 
           cat.category_name 
    FROM   categories cat 
    WHERE  EXISTS (SELECT 1 
                   FROM   sub_categories sub1 
                   WHERE  cat.id = sub1.category_id 
                          AND sub1.sub_category_name LIKE '%Chocolate%') 
           AND EXISTS (SELECT 1 
                       FROM   sub_categories sub2 
                       WHERE  cat.id = sub2.category_id 
                              AND sub2.sub_category_name LIKE '%Cookies%')
    
    SELECT cat.id, cat.category_name, GROUP_CONCAT(scat.sub_category_name ORDER By 
      scat.sub_category_name) AS sub_category
    FROM categories AS cat
    LEFT JOIN sub_categories AS scat ON scat.category_id = cat.id
    WHERE scat.sub_category_name LIKE '%Chocolate%' OR scat.sub_category_name LIKE '%Cookie%'
    GROUP BY cat.id