我有一张包含结构和数据的表格如下:
+----+---------------+ | id | category_name | +----+---------------+ | 1 | Confectionery | | 2 | Drinks | +----+---------------+
+----+-------------+-------------------+ | 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[[:>:]]'
任何人,请建议如何做到这一点。
提前致谢
答案 0 :(得分:2)
问题是只有第一个子类别同时包含chocolate
和cookies
,第二个子类别只有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 indexes和fulltext 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