我有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排序的简单问题。例如,给定数组: 我想按第一列排序数据以返回: 问题答案: 使用,其中是要排序的列索引: