有没有一种方法可以按照在子句中输入的顺序显示INNER JOIN条目?

时间:2019-04-29 12:25:19

标签: mysql sql

我是MySQL的初学者,因此我本人就自己创建了一种类型的翻译服务,例如Google翻译。问题是查询没有按照我输入的方式显示,而是由ID列排序。

我尝试(以我有限的知识)研究建立关系等的不同方式,以不同语言显示等价的单词。现在,我着手尝试使用INNER JOIN子句来显示和“组织”句子。

SELECT swedish.word,
       german.word,
       german.swear,
       swedish.swear,
       swedish.id
FROM   swedish
       INNER JOIN german
               ON swedish.id = german.id
WHERE  swedish.word = "Hej"
        OR swedish.word = "Mitt"
        OR swedish.word = "Namn"
        OR swedish.word = "Är"; 

这将在德语单词旁边显示瑞典语单词,也称为创建句子,但现在将按照我键入它们的顺序显示,而是按ID列排序,该ID列将单词混合在一起。有什么解决办法吗?

以下是结果的图片,并按ID排序:

enter image description here

我已经考虑过使用ORDER BY和某种临时值,然后对其进行排序,但是我不确定如何仅为选定的条目/行实现和自动递增该值。

我使用OR语句在同一结果中启用一个以上的条目,因为括号(在其他教程中可以看到)给了我语法错误。

此外,如果有更好的解决方法,请告诉我!

编辑:我想澄清一下,我知道这不是创建转存服务的可持续解决方案,我只是认为这是一种有趣的方式,可以使您更多地了解如何连接和使用不同的服务桌子等。

7 个答案:

答案 0 :(得分:1)

您可以使用FIND_IN_SET

ORDER BY FIND_IN_SET(swedish.word, 'Hej,Mitt,Namn,Är');

答案 1 :(得分:1)

  

此外,如果有更好的解决方法,请告诉我!

执行此任务不是数据库工作,而是前端工作

如果你有句子;

  

Hej Mitt Namn Ar Caius

然后前端应执行以下操作(伪代码):

string newsentence = “”
foreach(word in sentence.split(‘ ‘))
  newsentence = newsentence + “ “ + dblookup(word)

(您可以假定dblookup是一个辅助方法,该方法使用一个[瑞典语]单词并返回等效的[[德语]单词))

之所以保留顺序,是因为您遍历句子时按顺序执行数据库查找。您无需尝试将所有单词发送到数据库,而是强制对结果进行排序,以便将它们重新组合成一个句子,即可一次查找一个单词。如果您在一个句子中有两次相同的单词,则此处的所有方法(其他答案-在撰写此答案时)都会中断;句子“ hej mitt hej”将重新排序为“ hallo hallo meine”,因为您不能要求数据库命令将hej设置为第一和第三,所有“ hej”都将设置为第一

提交多个单词进行翻译并没有多大好处,虽然可能会有一些性能上的小好处,但这将是微不足道的。如果您正在设计此解决方案以提高性能,则可以让dblookup方法缓存几十万个最近请求的单词,但是请不要试图在“或或或”中向数据库提交整个句子样式和保留顺序;这样做太复杂了,没有任何实际意义

简单地说,这也不是语言的工作方式,尽管我很欣赏这是很早的阶段,您可能只是出于学习目的而学习它-您不能通过逐字翻译每个单词来制作翻译软件逐字逐字

答案 2 :(得分:1)

我会建议一个具有优先级的子查询:

SELECT s.word, g.word, g.swear, s.swear, s.id
FROM swedish s JOIN
     (SELECT 'Hej' as word, 1 as ord UNION ALL
      SELECT 'Mitt' as word, 2 as ord UNION ALL
      SELECT 'Namn' as word, 3 as ord UNION ALL
      SELECT 'Är' as word, 4 as ord
     ) w
     ON s.word = w.word JOIN
     german g
     ON s.id = g.id
ORDER BY w.ord;

与其他方法相比,此方法的优势在于单词列表仅包含一次。这样可以更轻松地进行更新,并防止在编写w查询时出错。

答案 3 :(得分:0)

您可以在ORDER BY中提供使用CASE对行进行排序的方式:

SELECT 
  swedish.word, german.word, german.swear, swedish.swear, swedish.id 
FROM swedish INNER JOIN german 
ON swedish.id = german.id 
WHERE swedish.word IN ('Hej', 'Mitt', 'Namn', 'Är')
ORDER BY CASE swedish.word
  WHEN 'Hej' THEN 1
  WHEN 'Mitt' THEN 2
  WHEN 'Namn' THEN 3
  WHEN 'Är' THEN 4
END

答案 4 :(得分:0)

不确定这是否是您的意思,但是请尝试以下方式:

   SELECT swedish.word,
           german.word,
           german.swear,
           swedish.swear,
           swedish.id
    FROM   swedish
           INNER JOIN german
                   ON swedish.id = german.id
    WHERE  swedish.word = "Hej"
            OR swedish.word = "Mitt"
            OR swedish.word = "Namn"
            OR swedish.word = "Är"
    ORDER BY field(swedish.word,"Hej","Mitt","Namn","Är");

答案 5 :(得分:0)

您的问题有一些基本问题:

  

我已经自己创建了一种翻译服务,例如google translation。

自动翻译是困难的,并且不能仅通过逐字查找数据库来解决(特别是如果您是“涉及MySQL的初学者”)。语言具有许多复杂的语法规则,您不能仅通过逐字翻译来翻译句子。看一下this article:您真的必须涉足诸如机器学习之类的事情,而不是(仅仅是)数据库开发。

如果您想获得自动翻译的经验,则可能需要看看Google Translate API

另一个问题是每种语言似乎都有单独的表/实体。这是有问题的:随着语言数量的增加,表的数量也会增加。要从Language A转换为Language B,您必须知道要使用哪些表,这可能涉及动态SQL。正确规范化数据会更好。像这样:

CREATE TABLE Words
(
    word_id INT PRIMARY KEY, 
    universal_name VARCHAR(255) -- the "universal" way to refer to a word (e.g. you could store the Esperanto version).
);

INSERT INTO Words
(word_id, universal_name) 
VALUES 
(1, 'hello');

CREATE TABLE word_translations
(
    word_id INT NOT NULL FOREIGN KEY REFERENCES Words(word_id), 
    language VARCHAR(255) NOT NULL, 
    word_name VARCHAR(255) NOT NULL
);

INSERT INTO word_translations
(word_id, language, word_name)
VALUES
(1, 'en', 'hello'),
(1, 'es', 'hola');

但是,这又不能真正解决翻译问题,因为逐词翻译还不够。

答案 6 :(得分:0)

答案与Gordon Linoff相同,只是自动对过滤器列表的顺序进行编号:

CREATE TABLE tbl
    (fruit varchar(10), sweetness int)
;

INSERT INTO tbl
    (fruit, sweetness)
VALUES
    ('apple', 7),
    ('banana', 6),
    ('papaya', 4),
    ('grape', 2),
    ('watermelon', 3)
;

查询,仅出于表现力就包括Postgres:)

实时测试:http://sqlfiddle.com/#!17/3fa48/3

with a as
(
   select * 
   from unnest(array['banana','grape','apple','banana']) 
   with ordinality as x(f,i)
)
select tbl.*,'',a.i 
from tbl
join a on tbl.fruit = a.f
order by a.i;

输出:

|  fruit | sweetness | ?column? | i |
|--------|-----------|----------|---|
| banana |         6 |          | 1 |
|  grape |         2 |          | 2 |
|  apple |         7 |          | 3 |
| banana |         6 |          | 4 |

查询MySQL:

实时测试:http://sqlfiddle.com/#!9/86b0d9/4

select tbl.*, '', a.i 
from tbl
join (
    select @i := @i + 1 as i, x.f
    from
    (
      select 'banana' as f
      union all
      select 'grape'
      union all
      select 'apple'
      union all
      select 'banana'
    ) as x
    cross join (select @i := 0) y    
) a on tbl.fruit = a.f
order by a.i;

输出:

|  fruit | sweetness |  | i |
|--------|-----------|--|---|
| banana |         6 |  | 1 |
|  grape |         2 |  | 2 |
|  apple |         7 |  | 3 |
| banana |         6 |  | 4 |        
相关问题