postgresql - PostgreSQL:这个查询可以更短吗?
问题描述
表“产品”
ID | 产品名称 | 产品描述 |
---|---|---|
1. | 富 | 这是 foo desc |
2. | 酒吧 | 条形图 |
3 | 粘性物。 | 好描述 |
连接表“ingredient_product”
ID | product_id | 成分ID |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 2 |
4 | 2 | 3 |
5 | 3 | 5 |
6 | 3 | 4 |
表“成分”
ID | 成分名称 |
---|---|
1 | 苹果 |
2 | 鸡 |
3 | 牛肉 |
4 | 鸡油 |
5 | 燕麦 |
6 | 豌豆纤维 |
const {keyword} = req.query
const response = await pool.query(
'SELECT product.name AS product_name FROM product
JOIN ingredient_product ON ingredient_product.product_id = product.id
JOIN ingredient ON ingredient_product.ingredient_id = ingredient.id
WHERE ingredient.name ILIKE $1',
[`%${keyword}%`]
);
嗨,我对 sql 很陌生,我的查询似乎总是很长。
所以我一直想知道这个查询(上面)是否可以缩短?或者有没有更好的写法?
谢谢!
解决方案
没有概念上更简单的方法可以做到这一点。你可以做一些语法上的简化——JOIN
你可以SELECT
从多个表中而不是使用 s,然后用WHERE
-conditions 过滤它们:
SELECT product.name AS product_name
FROM product, ingredient_product, ingredient
WHERE
ingredient.name ILIKE $1
AND
ingredient_product.product_id = product.id
AND
ingredient_product.ingredient_id = ingredient.id
我能想象的最短查询(以字符长度计)是这样的:
SELECT p.name AS product_name FROM product p, ingredient_product b, ingredient i WHERE i.name ILIKE $1 AND b.product_id = product.id AND b.ingredient_id = ingredient.id
在记录级别上,所有这些都将做同样的事情。
推荐阅读
- c - 如何将库从 C 导入汇编代码?
- c - 没有 pow 的 C 中的 2 的 N 次方
- java - ObjectMapper 读取值失败
- excel - 修改 VBA 以遍历已知的服务器列表
- socket.io - peerjs myPeer.call(id,stream) 什么都不做
- java - JavaFX 触摸事件未触发 - Ubuntu 20.04 触摸笔记本电脑
- c - 获取指针指向的数组的单个元素的大小——字符指针
- java - 运行 JUnit 5 测试时如何覆盖 Spring 组件扫描?
- r - 为什么 as(spdf, "owin") 会抛出错误 'spatstat.options' 不是从 'namespace:spatstat' 导出的对象
- flutter - 通过 GlobalKey 验证的颤振测试问题