首页 > 解决方案 > 在python中使用SQL选择指定行之前和之后的行

问题描述

预先感谢您提供的任何帮助

我正在制作一个 API,从字典中检索单词,到目前为止一切都很好。
创建该 API 的要求之一是,当有人向此端点(例如:http ://example.com/words/house )发送请求时,返回该单词和所有其他字段,让我向您展示更多详细信息。

我有这张表:

 word          varchar,
 definition    text,
 pharseology   text,
 etymology     text,
 onomastics    text,
 example       text,
 dictionary_id integer -> FK

所以基本上,当我去这个端点时,会得到一个 JSON 响应,其中包含单词,也是同义词,我有一个单独的表指向这个与 one->Many 相关的表,从单词到同义词,

在此处输入图像描述

现在让我进入正题,请求说当你请求一个单词 ex “house” 时,应该有一个像图片一样的响应,而且还有一个 List 包含该单词之前的所有单词, 和那个词之后。例如,如果您搜索“foot”这个词,那么词之后可以是foot 战士、foot trafic 等,或者在“eating”或 smth 之前。

所以我有两个问题:
1.我应该创建一个新表并与单词表建立关系以显示指定单词具有的这些单词列表。
2.如何编写查询以获取定义单词顶部和底部的所有行..

谢谢大家的答案,

标签: pythonsqldatabase

解决方案


我不会为此创建另一个表。以下使用 SQL Server 语法的查询将在搜索词 (@SearchWord) 之前和之后为您提供一组词 (@WordRange)。如果您使用的是 SQL Server 以外的数据库,则应该可以修改语法以适合您。

基本思想是按字母顺序排列所有单词并为其分配一个行号。然后根据其行号选择所有在搜索词之前和之后的行数的词。

CREATE TABLE #Dictionary
(
    ID INT
  , Word VARCHAR(50)
);

INSERT INTO #Dictionary
(
    ID
  , Word
)
VALUES (1, 'Elephant'), (2, 'Eel'), (3, 'Armadillo'), (4, 'Armor')
, (5, 'Fence'), (6, 'Park'), (7, 'Mouse'), (8, 'House'), (9, 'Hull')
, (10, 'Sidewalk'), (11, 'Monitor');

------------------------------------------------------------------------------------------------------------------------

DECLARE
    @SearchWord         VARCHAR(50)
  , @SearchWordPosition INT
  , @WordRange          INT;

SET @SearchWord = 'House';
SET @WordRange = 3;

SELECT ID, Word, ROW_NUMBER() OVER (ORDER BY Word) rn FROM #Dictionary;

SELECT @SearchWordPosition = x.rn
FROM   (SELECT Word, ROW_NUMBER() OVER (ORDER BY Word) rn FROM #Dictionary) x
WHERE  x.Word = @SearchWord;

SELECT
      x.Word
    , x.rn
FROM  (SELECT Word, ROW_NUMBER() OVER (ORDER BY Word) rn FROM #Dictionary) x
WHERE x.rn BETWEEN (@SearchWordPosition - @WordRange) AND (@SearchWordPosition + @WordRange);

你可以在这里看到它的实际效果。


推荐阅读