SQLite:使用单独的行搜索关键字'table并连接多个table

SQLite: search keywords' table with separate rows and joining multiple tables

我有三个 SQLite table,一个 products table,一个 keywords_products table 和 关键字 table.

CREATE TABLE products (
    product_rec_id  INTEGER  PRIMARY KEY  NOT NULL,
    name            VARCHAR (100)  NOT NULL
);

CREATE TABLE keywords_products (
    keyword_rec_id INTEGER NOT NULL,
    product_rec_id INTEGER NOT NULL
);

CREATE TABLE keywords (
    keyword_rec_id INTEGER  PRIMARY KEY  NOT NULL,
    keyword        VARCHAR (50)  NOT NULL  UNIQUE
);

keywords_productstable保存了一个产品的记录id和一个关键词的记录id。每个产品可以在关键字 table.

中分配多个关键字

关键字 table 如下所示:

keyword_rec_id  keyword
--------------  -----------
60              melee
43              scifi
87              water

keywords_productstable是这样的(一个关键词可以分配给很多产品):

keyword_rec_id  product_rec_id
--------------  --------------
43              1
60              1
43              2
87              3

产品 table 看起来像这样:

product_rec_id  name
--------------  --------------
1               Scifi Melee Weapons
2               Scifi Ray Weapon
3               Lake House

很长一段时间以来,我一直在使用这个 SQL 命令,但我只是注意到对于 AND 操作,它显然不起作用,因为所有关键字都在不同的行中。

SELECT
  products.product_rec_id,
  keywords.keyword
FROM
  products
  LEFT OUTER JOIN keywords_products ON
    products.product_rec_id = keywords_products.product_rec_id
  LEFT OUTER JOIN keywords ON
    keywords_products.keyword_rec_id = keywords.keyword_rec_id
WHERE
  (keywords.keyword LIKE '%scifi%' OR
    keywords.keyword LIKE '%melee%')

有时我希望能够检索匹配输入的所有关键字 (AND) 或仅匹配其中一个关键字 (OR) 的产品(OR 操作是我现在唯一可以做的)。

您可以使用 HAVING:

SELECT  products.product_rec_id, COUNT(DISTINCT keywords.keyword) AS cnt
FROM  products
LEFT OUTER JOIN keywords_products ON
    products.product_rec_id = keywords_products.product_rec_id
LEFT OUTER JOIN keywords ON
    keywords_products.keyword_rec_id = keywords.keyword_rec_id
WHERE  (keywords.keyword LIKE '%scifi%' OR   keywords.keyword LIKE '%melee%')
GROUP BY products.product_rec_id
HAVING SUM(CASE WHEN keywords.keyword LIKE '%scifi%' THEN 1 ELSE 0 END)>0
  AND SUM(CASE WHEN keywords.keyword LIKE '%melee%' THEN 1 ELSE 0 END) > 0;

编辑:

同时获取两者(如果在同一行):

SELECT  products.product_rec_id,keywords.keyword
FROM  products
LEFT OUTER JOIN keywords_products ON
    products.product_rec_id = keywords_products.product_rec_id
LEFT OUTER JOIN keywords ON
    keywords_products.keyword_rec_id = keywords.keyword_rec_id
WHERE  keywords.keyword LIKE '%scifi%melee%'
   OR keywords.keyword LIKE '%melee%scifi%';