Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何从联接中排除某些字符串_Mysql_Sql_Search - Fatal编程技术网

Mysql 如何从联接中排除某些字符串

Mysql 如何从联接中排除某些字符串,mysql,sql,search,Mysql,Sql,Search,使用mysql 5.7,我想查询article表中具有最相似tag列的行: CREATE TABLE `article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `body` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_

使用mysql 5.7,我想查询
article
表中具有最相似
tag
列的行:

 CREATE TABLE `article` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `body` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `slug` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `lasthit` datetime DEFAULT CURRENT_TIMESTAMP,
  `tag1` varchar(100) NOT NULL DEFAULT 'NA',
  `tag2` varchar(100) NOT NULL DEFAULT 'NA',
  `tag3` varchar(100) NOT NULL DEFAULT 'NA',
  PRIMARY KEY (`id`),
  KEY `created_at` (`created_at`)
) ENGINE=InnoDB AUTO_INCREMENT=10800 DEFAULT CHARSET=utf8 
我的问题是:

SELECT newA.title, newA.slug, newA.tag1, newA.tag2, newA.tag3
        FROM article a
        JOIN article newA
          ON newA.tag1 IN (a.tag1, a.tag2, a.tag3) OR
             newA.tag2 IN (a.tag1, a.tag2, a.tag3) OR
             newA.tag3 IN (a.tag1, a.tag2, a.tag3)
        WHERE a.id = 242 
           AND newA.id != a.id
        ORDER BY
          (newA.tag1 IN (a.tag1, a.tag2, a.tag3) IS NOT NULL) +
          (newA.tag2 IN (a.tag1, a.tag2, a.tag3) IS NOT NULL) +
          (newA.tag3 IN (a.tag1, a.tag2, a.tag3) IS NOT NULL)
          DESC
        LIMIT 10;
我希望排除标记长度小于2个字符的结果,以便不相关的项(标记列为空或仅包含
NA
的项)不会潜入

我所做的是将
和LEN(a.tag1)>2和LEN(a.tag2)>2和LEN(a.tag3)>2添加到
WHERE
子句中,但随后我得到了大量
显示所有1333种可能性(y或n)
而不是结果

我也试过了

  ...
      ON (newA.tag1 IN (a.tag1, a.tag2, a.tag3) OR
         newA.tag2 IN (a.tag1, a.tag2, a.tag3) OR
         newA.tag3 IN (a.tag1, a.tag2, a.tag3)) AND
        (LEN(a.tag1)>2 AND LEN(a.tag2)>2 AND LEN(a.tag3)>2)        
  ...
但是我得到了

ERROR 1305 (42000): FUNCTION myawsomedb.LEN does not exist
如何解决此问题?

使用
LENGTH()>2
并结合您现有的标准和适当的括号:

SELECT newA.title, newA.slug, newA.tag1, newA.tag2, newA.tag3
FROM article a
JOIN article newA
  ON newA.id > a.id
  AND
  (
       (LENGTH(newA.tag1) > 2 AND newA.tag1 IN (a.tag1, a.tag2, a.tag3))
    OR (LENGTH(newA.tag2) > 2 AND newA.tag2 IN (a.tag1, a.tag2, a.tag3))
    OR (LENGTH(newA.tag3) > 2 AND newA.tag3 IN (a.tag1, a.tag2, a.tag3))
  )
WHERE a.id = 242
ORDER BY
  (LENGTH(newA.tag1) > 2 AND newA.tag1 IN (a.tag1, a.tag2, a.tag3)) +
  (LENGTH(newA.tag2) > 2 AND newA.tag2 IN (a.tag1, a.tag2, a.tag3)) +
  (LENGTH(newA.tag3) > 2 AND newA.tag3 IN (a.tag1, a.tag2, a.tag3))
  DESC
LIMIT 10;

(我做了这个
newA.id>a.id
,因为我希望一个“新”id大于旧的id。如果我错了,请将这个更改回
newA.id a.id
。)

最相似的那不是一个非常具体的标准。你能把它限定到某个特定的标准吗?这是这个问题的后续问题:我在这里更详细地解释了我的目标。在
where
子句中添加
条件只能减少所选行的数量,而不能增加它。@RiggsFolly这就是原因t排序依据-,它将匹配的标记数相加。MySQL不知道LEN()-它知道LENGTH()。