首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQLite:使用不同行搜索关键字的表并连接多个表

SQLite:使用不同行搜索关键字的表并连接多个表
EN

Stack Overflow用户
提问于 2018-03-25 17:41:55
回答 1查看 54关注 0票数 2

我有三个SQLite表,一个产品表,一个keywords_products表和一个关键字表。

代码语言:javascript
运行
复制
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_products表保存产品的记录id和关键字的记录id。每个产品都可以在关键字表中分配多个关键字。

关键字表如下所示:

代码语言:javascript
运行
复制
keyword_rec_id  keyword
--------------  -----------
60              melee
43              scifi
87              water

keywords_products表如下所示(可以为许多产品分配一个关键字):

代码语言:javascript
运行
复制
keyword_rec_id  product_rec_id
--------------  --------------
43              1
60              1
43              2
87              3

products表如下所示:

代码语言:javascript
运行
复制
product_rec_id  name
--------------  --------------
1               Scifi Melee Weapons
2               Scifi Ray Weapon
3               Lake House

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

代码语言:javascript
运行
复制
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%')

有时,我希望能够检索与输入的所有关键字(和)匹配的产品,或者仅仅检索一个关键字( or ) ( OR操作是我现在唯一能做的)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-25 18:29:57

你可以用HAVING

代码语言:javascript
运行
复制
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;

编辑:

若要同时获得两者(如果位于同一行):

代码语言:javascript
运行
复制
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%';
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49478887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档