如何在SQLite中关联多表并按行检索关键词表?
嘿,这事儿不难,咱们先理清楚表之间的关联逻辑,再给你写几种常用的SQL查询语句!
首先,你的三个表是典型的多对多关联结构:products和keywords通过中间表keywords_products建立关联——products.product_rec_id对应keywords_products.product_rec_id,keywords.keyword_rec_id对应keywords_products.keyword_rec_id。接下来根据不同的检索需求,咱们来写对应的SQL:
1. 检索所有产品及其对应的单个关键词(每行一个产品-关键词配对)
这个查询会把每个产品的每个关键词单独占一行,适合需要逐行处理关键词的场景:
SELECT p.product_rec_id, p.name, k.keyword FROM products p JOIN keywords_products kp ON p.product_rec_id = kp.product_rec_id JOIN keywords k ON kp.keyword_rec_id = k.keyword_rec_id ORDER BY p.product_rec_id;
2. 检索所有产品及其合并后的关键词(每行一个产品,关键词用逗号分隔)
如果想把同一个产品的所有关键词合并到一行展示,用SQLite的GROUP_CONCAT函数就行:
SELECT p.product_rec_id, p.name, GROUP_CONCAT(k.keyword, ', ') AS keywords FROM products p JOIN keywords_products kp ON p.product_rec_id = kp.product_rec_id JOIN keywords k ON kp.keyword_rec_id = k.keyword_rec_id GROUP BY p.product_rec_id, p.name ORDER BY p.product_rec_id;
3. 根据关键词反向检索对应的产品
如果要找包含某个特定关键词的所有产品,只需要加个WHERE条件:
SELECT p.product_rec_id, p.name FROM products p JOIN keywords_products kp ON p.product_rec_id = kp.product_rec_id JOIN keywords k ON kp.keyword_rec_id = k.keyword_rec_id WHERE k.keyword = '你的目标关键词' ORDER BY p.product_rec_id;
4. 包含无关键词的产品(左连接)
上面的查询都是内连接(JOIN),只会返回有关键词的产品。如果想保留所有产品,哪怕它没有任何关键词,用LEFT JOIN:
SELECT p.product_rec_id, p.name, COALESCE(GROUP_CONCAT(k.keyword, ', '), '无关键词') AS keywords FROM products p LEFT JOIN keywords_products kp ON p.product_rec_id = kp.product_rec_id LEFT JOIN keywords k ON kp.keyword_rec_id = k.keyword_rec_id GROUP BY p.product_rec_id, p.name ORDER BY p.product_rec_id;
这里用COALESCE函数把NULL(无关键词的情况)替换成了“无关键词”,让结果更友好。
内容的提问来源于stack exchange,提问作者nDelphi
相关产品推荐
相关产品推荐

