AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 327270
Accepted
Lance
Lance
Asked: 2023-05-19 07:29:02 +0800 CST2023-05-19 07:29:02 +0800 CST 2023-05-19 07:29:02 +0800 CST

如何按 PostgreSQL 中的连接表属性排序?

  • 772

我是 SQL 的新手,并且大部分时间都在使用 ORM(好吧,SQL 构建器,而不是原始 SQL)。我在Vercel Postgres版本 15中有一个简单的字典应用程序,具有这种模式:

CREATE TABLE words (
  id serial PRIMARY KEY,
  transcription_count INTEGER NOT NULL,
  pronunciation_count INTEGER NOT NULL,
  verified BOOLEAN NOT NULL
);

CREATE TABLE transcriptions (
  id serial PRIMARY KEY,
  word_id INTEGER REFERENCES words,
  text TEXT NOT NULL,
  system INTEGER NOT NULL,
  length INTEGER NOT NULL
);

CREATE TABLE pronunciations (
  id serial PRIMARY KEY,
  word_id INTEGER REFERENCES words,
  text TEXT NOT NULL,
  syllable_count INTEGER NOT NULL
);

例如,我想找到转录文本长度 >= 5 的所有单词,并对文本进行排序,但返回单词。每个转录都属于一个系统,每个系统可以有 1 个或多个转录(例如,给定“拉丁”系统,单词“color/colour”有 2 个拼写,作为一个粗略的例子)。此外,每个单词可以有多个系统(例如,中文有拼音和汉字作为 2 个可能的系统,在中文系统中有繁体和简体作为系统内的 2 个转录)。

这就是我的想法。

SELECT id from words
INNER JOIN transcriptions t ON t.word_id = words.id
WHERE t.length >= 5
AND t.system = 1
ORDER BY t.text ASC

这是正确的查询类型吗?这会返回重复的单词吗,因为我正在按连接表排序,并且存在 1<>many 关系?我不清楚这将如何工作/会返回什么样的结果。另外,作为第二个查询,我怎么能另外指定“只为每个单词选择匹配请求的第一个转录”,所以它只按每个单词的 1 个转录排序?

postgresql
  • 1 1 个回答
  • 16 Views

1 个回答

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2023-05-19T08:37:05+08:002023-05-19T08:37:05+08:00

    查询基本有效,但id含糊不清,排序顺序也是如此:

    SELECT w.id  -- table-qualify!
    FROM   words w
    JOIN   transcriptions t ON t.word_id = w.id
    WHERE  t.length >= 5
    AND    t.system = 1
    ORDER  BY t.text, w.id, t.id;  -- add tiebreaker(s) to make unambiguous
    

    “只为每个单词选择符合请求的第一个转录”

    走出去,我将其解释为:

    “对每个单词进行最短的符合条件的转录(按字母顺序排在首位),并列出按所选翻译排序的单词。”

    如果你只想返回,我们根本word.id不需要涉及表格:word

    SELECT word_id
    FROM  (
       SELECT DISTINCT ON (word_id)
              word_id, text
       FROM   transcriptions t
       WHERE  length >= 5
       AND    system = 1
       ORDER  BY word_id, length, text  -- pick the shortest, then alphabetically first
       ) t
    ORDER  BY text, word_id;  -- add tiebreaker to make unambiguous
    

    别的:

    SELECT w.*
    FROM  (
       SELECT DISTINCT ON (word_id)
              word_id AS id, text
       FROM   transcriptions t
       WHERE  length >= 5
       AND    system = 1
       ORDER  BY word_id, length, text  -- pick the shortest, then alphabetically first
       ) t
    JOIN   words w USING (id)
    ORDER  BY t.text, w.id;  -- add tiebreaker to make unambiguous
    

    DISTINCT ON对于每个单词很少的翻译通常是有效的。对于许多翻译,其他技术可能更好。看:

    • 选择每个 GROUP BY 组中的第一行?

    您还将受益于lengthand system(和word_idand text)上的一个或多个索引,但具体是哪个索引,这取决于未公开的细节。

    • 1

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve