我有三个SQLite表,一个产品表,一个 keywords_products 表和一个 keywords 表。
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。可以在关键字表中为每个产品分配多个关键字。
关键字表如下所示:
keyword_rec_id keyword
-------------- -----------
60 melee
43 scifi
87 water
keywords_products 表看起来像这样(一个关键字可以分配给许多产品):
keyword_rec_id product_rec_id
-------------- --------------
43 1
60 1
43 2
87 3
产品表如下所示:
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操作是我现在唯一能做的操作)。
答案 0 :(得分:2)
您可以使用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%';