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%';
我有三个 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%';