簡體   English   中英

如何從連接中排除某些字符串

[英]How to exclude certain strings from join

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

 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)>2WHERE子句,但是我得到了很多Display all 1333 possibilities? (y or n) 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

我怎樣才能解決這個問題?

使用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改回newA.id <> a.id 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM