gpt4 book ai didi

mysql - 根据可变条件选择多个单个(LIMIT 1)记录

转载 作者:行者123 更新时间:2023-11-29 02:02:10 24 4
gpt4 key购买 nike

我有两个表,chartschart_entries,我想获得当前排名前 5 的图表位置(基于选择最新的 chart_entries在给定位置)。

有没有办法让它成为一个单一的查询?理想情况下,我的图表最多包含 500 个位置,因此像这样进行多个查询并不可行。

在 rails 中,我目前在 Chart.rb 中使用此方法

def table
(1..5).each do |i|
chart_entries.where(position: i).order('entered_at DESC').first
end
end

生成如下SQL

SELECT "chart_entries".* FROM "chart_entries" WHERE "chart_entries"."chart_id" = 1 AND "chart_entries"."position" = 1 ORDER BY entered_at DESC LIMIT 1
SELECT "chart_entries".* FROM "chart_entries" WHERE "chart_entries"."chart_id" = 1 AND "chart_entries"."position" = 2 ORDER BY entered_at DESC LIMIT 1
SELECT "chart_entries".* FROM "chart_entries" WHERE "chart_entries"."chart_id" = 1 AND "chart_entries"."position" = 3 ORDER BY entered_at DESC LIMIT 1
SELECT "chart_entries".* FROM "chart_entries" WHERE "chart_entries"."chart_id" = 1 AND "chart_entries"."position" = 4 ORDER BY entered_at DESC LIMIT 1
SELECT "chart_entries".* FROM "chart_entries" WHERE "chart_entries"."chart_id" = 1 AND "chart_entries"."position" = 5 ORDER BY entered_at DESC LIMIT 1

这是表结构(postgresql)

CREATE TABLE chart_entries (
id integer NOT NULL,
chart_id integer,
entity_id integer,
"position" integer,
entered_at timestamp without time zone,
locale character varying(255)
);

CREATE TABLE charts (
id integer NOT NULL,
name character varying(255)
);

这是我的最终解决方案

chart_entries.where(position: [1..5]).group('position, id').having('entered_at = MAX(entered_at)').order('position ASC')

最佳答案

这很适合 GROUP BY:

SELECT
*
FROM
chart_entries
WHERE
chart_id = 1
AND position BETWEEN 1 AND 5
GROUP BY
position
HAVING
entered_at = MAX(entered_at)

使用 GROUP BY 将为每个位置选择一行。 HAVING 子句应按日期选择最新的(您也可以为此使用主键,因为它应该是最新的 - 除非您插入自定义日期)。

无需编写每个可用的位置,您可以在WHERE 子句中使用BETWEEN 来获取“所有位置 1 到 5"之间(或任何您的范围)。

关于mysql - 根据可变条件选择多个单个(LIMIT 1)记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12934611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com