MySQL查询AND条件

时间:2017-05-10 10:25:37

标签: mysql

我有一张包含结构和数据的表格如下:

  1. 类别:has_many sub_categories
  2. +----+---------------+  
    | id | category_name |  
    +----+---------------+  
    |  1 | Confectionery |  
    |  2 | Drinks        |    
    +----+---------------+
    
    1. 子类别:belongs_to:categories
    2. +----+-------------+-------------------+  
      | id | category_id | sub_categpry_name |  
      +----+-------------+-------------------+  
      |  1 |           1 | chocolate cookies |  
      |  2 |           2 | chocolate shake   |  
      |  3 |           2 | cookie shake      |    
      +----+-------------+-------------------+
      

      我正在这两个表中进行搜索。我的搜索关键字是" 巧克力和Cookie "。这应该在子类别表中搜索,并且应该返回子类别的类别。这个词"巧克力"在第2行中可用,第3行中有cookie,但是这两个子类属于同一类别,因此它应该返回第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[[:>:]]'
      

      任何人,请建议如何做到这一点。

      提前致谢

3 个答案:

答案 0 :(得分:2)

问题是只有第一个子类别同时包含chocolatecookies,第二个子类别只有chocolate。由于and,两个关键字都必须出现在相同 sub_categpry_name字段中。只是提醒一下:第3条记录与任何搜索都不匹配,因为它有cookie字样,但您正在搜索cookies

最简单的解决方案是使用or代替and

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[[:>:]]'

更好的解决方案是转移到fulltext indexesfulltext search

添加全文索引:

alter table sub_categories add index subcat_name_ft (sub_category_name)

全文搜索:

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)

请确保您熟悉全文搜索限制(最小字长,停用词,鼻子等)和功能。

答案 1 :(得分:0)

如果我理解正确,您的要求可以解释为找到子类别与巧克力 Cookie 关键字匹配的类别。 你可以试试。

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%')

如果要获取子类别的信息,可以更新查询以与表子类别连接。

答案 2 :(得分:0)

你可以这样做:

var app = angular.module('myapp', ['ui.bootstrap']);


app.controller('FeedController', function ($scope, $http) {


$scope.customPostText = "";
$scope.sendMessage = function()
{
    console.log("text ");
    console.log($scope.postcommentForm.customPostText);
    var length = $scope.postcommentForm.customPostText.length
    if(length >4 && length < 255)
    {
                alert("not undefined");
    }
    else
    {
        alert("Bericht moet minimaal 5 karakters bevatten.");
    }
}

和小提琴是here