Mysql 如何从联接中排除某些字符串
使用mysql 5.7,我想查询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_
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()。