当前位置: 首页 > 面试题库 >

PostgreSQL-按数组排序

花永昌
2023-03-14
问题内容

我有2个表格-包含课程ID和课程名称的课程以及包含每个课程标签的tagCourse。

course                    tagcourse
------------            ----------------
PK id_course            PK tag
   name                 PK, FK id_course

我想编写一个函数,该函数按给定的标签数组搜索课程,并按匹配标签的数量将其返回。但是我不知道如何正确,有效地编写它。请帮我。

IE。

CREATE OR REPLACE FUNCTION searchByTags(tags varchar[])
RETURNS SETOF.....
  RETURN QUERY SELECT * FROM course c INNER JOIN tagcourse tc ON c.id_course = tc.id_course
  WHERE ???  ORDER BY ???

END....

问题答案:

CREATE OR REPLACE FUNCTION search_by_tags(tags varchar[])
RETURNS TABLE (id_course integer, name text, tag_ct integer) AS
$func$
SELECT id_course, c.name, ct.tag_ct
FROM (
SELECT tc.id_course, count(*)::int AS tag_ct
FROM unnest($1) x(tag)
JOIN tagcourse tc USING (tag)
GROUP BY 1 – first aggregate ..
) AS ct
JOIN course c USING (id_course) – .. then join
ORDER BY ct.tag_ct DESC – more columns to break ties?
$func$ LANGUAGE sql;


  • 用于unnest()从您的输入数组生成表。

  • 您不需要为此使用plpgsql。使用简单的SQL函数更简单。

  • 我使用unnest($1)(带有位置参数)代替unnest(tags),因为后者仅对SQL函数中的PostgreSQL 9.2+有效(与plpgsql不同)。我在这里引用手册:

在较早的数字方法中,使用以下语法引用参数$n$1引用第一个输入参数,引用第二个输入参数,$2依此类推。无论是否使用名称声明了特定参数,这都将起作用。

  • count()返回bigint。您需要将其强制转换int为与声明的返回类型匹配,或者将返回的列声明为bigint开头。

  • 使用USING(equi-joins):USING (tag)而不是简化语法的完美时机ON tc.tag = c.tag

  • 通常, 聚合 然后再 连接到另一个表通常会更快。减少所需的联接操作。 根据注释中@Clodoaldo的问题,这是一个 SQL
    Fiddle
    来演示区别。

  • OTOH,如果在连接后进行聚合,则不需要子查询。较短,但可能较慢:

    SELECT c.id_course, c.name, count(*)::int AS tag_ct
    FROM unnest($1) x(tag)
    JOIN tagcourse tc USING (tag)
    JOIN course c USING (id_course)
    GROUP BY 1
    ORDER BY 3 DESC; – more columns to break ties?



 类似资料:
  • 问题内容: 我需要运行一个MySQL查询,该查询的顺序由数组值确定。 我的数组是可变的,但数组中的值对应于我的数据库表中名为“ ID”的字段,因此我希望结果以ID顺序9、1、4返回。 这在MySQL中是否可能,还是可以在之后使用数组对MySQL $ result进行排序?您可以假设返回的唯一值是数组中的值。 问题答案: http://dev.mysql.com/doc/refman/5.5/zh-

  • 我在学校的任务是创建一个程序,以升序排列数组的值。它几乎就在那里,但每当我输入“44 55 66 22 33 11 77 99 88 66”或它输出的任何数字 -858993460,11,22,33,44,55,66,66,77,88,或开头为负数 第一个数字到底怎么了?我是不是缺了什么? 我对C++很陌生,我不太明白这里的问题。如果有什么建议我可以用请告诉他们。 }

  • 问题内容: 我有以下数组结构: 基于,以增量方式对数组进行排序的最佳方法是什么? 因此结果如下所示: 问题答案: 使用。 在PHP≥5.3中,应改为使用匿名函数: 请注意,以上两个代码均假定为整数。 在PHP≥7.0,使用,而不是减法,以防止溢出/截断问题。

  • 问题内容: 我现在只需获取数组的前3个对象并映射它们: 每个都有一个属性(champ.level)。 如何将输出分类到 前三个切片中? 问题答案: 与自定义比较功能一起使用时,首先要进行降序排序: 使用ES6甚至更好:

  • 问题内容: 我如何对数组进行排序: 数组结构可能类似于: 那么数据是根据数组的 标题字段* 以 ASC顺序 显示的吗? * 问题答案: 为此使用显式构建的用途。

  • 问题内容: 我有一个关于如何按给定列对整个数组/ recarray排序的简单问题。例如,给定数组: 我想按第一列排序数据以返回: 问题答案: 使用,其中是要排序的列索引: