我是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排序:
我已经考虑过使用ORDER BY和某种临时值,然后对其进行排序,但是我不确定如何仅为选定的条目/行实现和自动递增该值。
我使用OR语句在同一结果中启用一个以上的条目,因为括号(在其他教程中可以看到)给了我语法错误。
此外,如果有更好的解决方法,请告诉我!
编辑:我想澄清一下,我知道这不是创建转存服务的可持续解决方案,我只是认为这是一种有趣的方式,可以使您更多地了解如何连接和使用不同的服务桌子等。
答案 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 |