将这个 SQL 表用于标记系统:
CREATE TABLE tags (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
CREATE INDEX tags_name_idx ON tags(name);
CREATE TABLE tagged_items (
tag_id INT,
item_id INT
);
CREATE INDEX tagged_items_tag_id_idx ON tagged_items(tag_id);
CREATE INDEX tagged_items_item_id_idx ON tagged_items(item_id);
CREATE TABLE items (
id SERIAL PRIMARY KEY,
content VARCHAR(255)
);
用户在 SQL 中的布尔表达式查询“ tag1 AND tag2 ”为:
SELECT items.* FROM items
INNER JOIN tagged_items AS i1 ON (items.id = i1.item_id) INNER JOIN tags AS t1 ON (i1.tag_id = t1.id)
INNER JOIN tagged_items AS i2 ON (items.id = i2.item_id) INNER JOIN tags AS t2 ON (i2.tag_id = t2.id)
WHERE t1.name = 'tag1' AND t2.name = 'tag2';
您如何将其他带有布尔表达式的查询(例如“ tag1 OR tag2 AND tag3 ”……甚至更复杂的查询(例如“ tag1 AND (tag2 OR tag3) AND NOT tag4 OR tag5 ”)转换为 SQL?