鉴于我有一个包含以下内容的表,内容非常简单:
# select * from messages;
id | verbosity
----+-----------
1 | 20
2 | 20
3 | 20
4 | 30
5 | 100
(5 rows)
Run Code Online (Sandbox Code Playgroud)
我想选择N个消息,其中详细程度的总和低于Y(为了测试目的,假设它应该是70,那么正确的结果将是id为1,2,3的消息).这对我来说非常重要,该解决方案应该是独立于数据库的(至少应该在Postgres和SQLite上工作).
我试着用这样的东西:
SELECT * FROM messages GROUP BY id HAVING SUM(verbosity) < 70;
Run Code Online (Sandbox Code Playgroud)
但是它似乎没有按预期工作,因为它实际上并没有从详细列中汇总所有值.
我会非常感谢任何提示/帮助.
我需要最低价值runnerId.
这个查询:
SELECT "runnerId" FROM betlog WHERE "marketId" = '107416794' ;
Run Code Online (Sandbox Code Playgroud)
需要80毫秒(1968结果行).
这个:
SELECT min("runnerId") FROM betlog WHERE "marketId" = '107416794' ;
Run Code Online (Sandbox Code Playgroud)
需要1600毫秒.
是否有更快的方法来找到最小值,或者我应该在我的java程序中计算min?
"Result (cost=100.88..100.89 rows=1 width=0)"
" InitPlan 1 (returns $0)"
" -> Limit (cost=0.00..100.88 rows=1 width=9)"
" -> Index Scan using runneridindex on betlog (cost=0.00..410066.33 rows=4065 width=9)"
" Index Cond: ("runnerId" IS NOT NULL)"
" Filter: ("marketId" = 107416794::bigint)"
CREATE INDEX marketidindex
ON betlog
USING btree
("marketId" COLLATE pg_catalog."default");
Run Code Online (Sandbox Code Playgroud)
另一个想法:
SELECT "runnerId" FROM betlog WHERE …Run Code Online (Sandbox Code Playgroud) 我遇到了一个与PostgreSQL查询类似的问题,但限制为1的速度非常慢,而带ORDER和LIMIT子句的PostgreSQL 速度非常慢,尽管在我的情况下,是否LIMIT为1、5或500 都没有关系。
基本上,当我无限制地运行由Django的ORM生成的查询时,该查询花费了半秒钟,但有限制(为分页而增加)则需要7秒钟。
耗时7秒的查询是:
SELECT "buildout_itemdescription"."product_code_id",
MIN("buildout_lineitem"."unit_price") AS "min_price"
FROM "buildout_lineitem"
INNER JOIN "buildout_itemdescription"
ON ("buildout_lineitem"."item_description_id" = "buildout_itemdescription"."id")
WHERE (("buildout_lineitem"."report_file_id" IN (154, 172, 155, 181, 174, 156, 157, 182, 175, 176, 183, 158, 177, 159, 179, 178, 164, 180, 367, 165, 173, 166, 167, 168, 368, 422, 370, 169, 1335, 1323, 161, 160, 162, 170, 171, 676, 151, 163, 980, 152, 369, 153, 963, 1718, 881, 617, 1759, 1780, …Run Code Online (Sandbox Code Playgroud) 使用SqlAlchemy,是否可以构建一个只更新第一个匹配行的查询?
就我而言,我需要更新最新的日志条目:
class Log(Base):
__tablename__ = 'logs'
id = Column(Integer, primary_key=True)
#...
analyzed = Column(Boolean)
session.query(Log) \
.order_by(Log.id.desc()) \
.limit(1) \
.update({ 'analyzed': True })
Run Code Online (Sandbox Code Playgroud)
结果如下:
InvalidRequestError:调用limit()时无法调用Query.update()
这是有道理的,因为它UPDATE ... LIMIT 1是一个仅限MySQL的功能(这里给出了解决方案)
但是我如何对PostgreSQL做同样的事情呢?可能,使用子查询方法?
我正在用 Java 编写代码,每次运行此代码时,我都想从 MySQL 表中提取下一行。第二次运行此代码时就是这样。
String timh1 = "1";
String timh2 = "2";
PreparedStatement st = null;
String sqlGrammes = "SELECT SURNAME ,KATHGORIA, AFM , NAME FROM EMPLOYEE LIMIT ?,? ";
try {
st = connection.prepareStatement(sqlGrammes);
st.setString(1, timh1);
st.setString(2, timh2);
Run Code Online (Sandbox Code Playgroud)
但它向我展示了这个错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在第 1 行的“1”、“2”附近使用的正确语法
我想按 id 按降序对结果进行排序,然后根据 @condition 限制获得的行数
ORDER BY id DESC
IF @condition is TRUE THEN LIMIT 1
ELSE nothing
END IF
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用SQL设置分页.我想要每页3个结果,这就是我所做的:
SELECT mot_cle.* FROM mot_cle
ORDER BY hits DESC LIMIT 3 OFFSET 0; --Page 1
SELECT mot_cle.* FROM mot_cle
ORDER BY hits DESC LIMIT 3 OFFSET 3; --Page 2
SELECT mot_cle.* FROM mot_cle
ORDER BY hits DESC LIMIT 3 OFFSET 6; --Page 3
SELECT mot_cle.*
FROM mot_cle
ORDER BY hits DESC LIMIT 3 OFFSET 9; --Page 4
Run Code Online (Sandbox Code Playgroud)
我检查了很多次,这不是很复杂,但我的结果并不是我所期望的:
第1页:
+-----+--------+------+
| id | mot | hits |
+-----+--------+------+
| 2 | test | 46 |
| 1 | blabla | …Run Code Online (Sandbox Code Playgroud) 以下是我的查询:
SELECT *
FROM (
SELECT f.max, f.min, p.user_id, p.id, p.title, p.rating,
RANK() OVER (
PARTITION BY p.user_id
ORDER BY p.rating DESC, p.id DESC
) AS rnk
FROM posts AS p
INNER JOIN friends AS f ON (p.user_id = f.friend_id)
WHERE f.user_id=1
) AS subq
WHERE (subq.rnk <= subq.max)
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
它会搜索我朋友的帖子,按照评分和日期排序.在此查询中实现的窗口函数允许我根据表上的MAX字段限制为每个朋友返回的行数Friends.
但是,我还有一个字段MIN,用于指定给定朋友的查询所需的最小帖子数.怎么可能?
我也想知道SQL是否是这些类型查询的最佳选择?我已经尝试过Neo4j Graph数据库,虽然它似乎是一个很好的解决方案,但我宁愿避免使用2个独立的数据库.
架构:
CREATE TABLE friends(
user_id int,
friend_id int,
min int,
max int
);
CREATE TABLE posts(
id int, …Run Code Online (Sandbox Code Playgroud) 在PostgreSQL中,我想根据某些条件选择一行,但如果没有符合条件的行,我想返回第一行.该表实际上包含一个序数列,因此任务应该更容易(第一行是序号为0的那一行).例如:
SELECT street, zip, city
FROM address
WHERE street LIKE 'Test%' OR ord = 0
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,没有办法保证匹配的记录的顺序,我没有任何东西可以按顺序排序.使用单个SELECT语句执行此操作的方法是什么?
sql-limit ×10
postgresql ×7
sql ×7
mysql ×2
indexing ×1
java ×1
jdbc ×1
neo4j ×1
performance ×1
python ×1
resultset ×1
select ×1
sql-order-by ×1
sql-update ×1
sqlalchemy ×1
sqlite ×1