Используя 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
, не проникают внутрь.
Что я сделал, так это добавил AND LEN(a.tag1)>2 AND LEN(a.tag2)>2 AND LEN(a.tag3)>2
к WHERE
предложению, но затем я получил много Display all 1333 possibilities? (y or 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
Как я могу это исправить?