Как исключить определенные строки из соединения - PullRequest
0 голосов
/ 24 марта 2020

Используя 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

Как я могу это исправить?

1 Ответ

1 голос
/ 25 марта 2020

Используйте 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, потому что я ожидаю, что «новый» идентификатор будет больше, чем старый. Изменить это обратно на newA.id <> a.id на случай, если я ошибаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...