假设我有这张表
CREATE TEMP TABLE pizzas (
pizza_id INT,
name TEXT,
ingredients TEXT,
kingsize_ingredients TEXT
);
和一些条目
pizza_id | name | ingredients | kingsize_ingredients
---------+-----------------+-----------------------------+-------------------------------------
1 | moutainview | cheese,sausage,potato | cheese,sausage,potato,tomato
2 | the o' chicken | cheese,chicken,tomato | cheese,chicken,tomato,eggs
3 | hawai | mozarella,tomato,pineapple | mozarella,tomato,pineapple,sausage
这是虚构的,在这个例子中我将成分堆叠在一个长逗号分隔的字符串中,我知道它是愚蠢的,但我试图为我的问题提供一个环境。
基本上,虚拟引擎接受一个字符串并在pizzas
表中搜索匹配项。搜索是在多个列上执行的,我的目标是使搜索引擎不仅会返回搜索匹配的比萨的名称,还会返回搜索匹配的行中的列
例如,如果我在上一个表中搜索<em>&#34; tomato&#34; ,我应该有这个输出:
name | found_in
----------------+-------------------------------------
mountainview | {kingsize_ingredients}
hawai | {ingredients,kingsize_ingredients}
the o' chicken | {ingredients,kingsize_ingredients}
实际上我回答了我的问题,在这里我提供了解决方案:
SELECT
name,
array_agg(found_in) AS found_in
FROM (
SELECT
*,
'ingredients' AS found_in
FROM pizzas
WHERE ingredients ILIKE '%tomato%'
UNION ALL
SELECT
*,
'kingsize_ingredients' AS found_in
FROM pizzas
WHERE kingsize_ingredients ILIKE '%tomato%'
) AS founds
GROUP BY (name)
但我认为在搜索方面,优化是一个优先事项,因为我用我个人对PostgreSQL的知识(这不是我的专业领域)进行了这个查询,我不确定我是否正确。这个问题不是要讨论使PostgreSQL查询尽可能优化的方式是什么,它是关于询问这个查询是否有错误的结构或缺陷?
以下是需要在家初始化的代码:
DROP TABLE IF EXISTS pizzas;
CREATE TEMP TABLE pizzas (
pizza_id INT,
name TEXT,
ingredients TEXT,
kingsize_ingredients TEXT
);
INSERT INTO pizzas VALUES
(1, 'moutainview', 'cheese,sausage,potato', 'cheese,sausage,potato,tomato'),
(2, 'the o'' chicken', 'cheese,chicken,tomato', 'cheese,chicken,tomato,eggs'),
(3, 'hawai', 'mozarella,tomato,pineapple', 'mozarella,tomato,pineapple,sausage');
由于