Mysql 通过具有
我有一个包含3列的表:id、句子和语言。所以句子可以是英语和德语,ID被分配给意思相同但语言不同的句子,比如Mysql 通过具有,mysql,group-by,having-clause,Mysql,Group By,Having Clause,我有一个包含3列的表:id、句子和语言。所以句子可以是英语和德语,ID被分配给意思相同但语言不同的句子,比如 ID | sentence | language 1 | Hello | en 1 | Hallo | de 2 | Sorry | en 有些句子可能只存在于一种语言中。现在我想找出两种语言中可用的所有句子,我可以使用: SELECT * FROM `sentences` WHERE LENGTH(sentence) > 0
ID | sentence | language
1 | Hello | en
1 | Hallo | de
2 | Sorry | en
有些句子可能只存在于一种语言中。现在我想找出两种语言中可用的所有句子,我可以使用:
SELECT
*
FROM
`sentences`
WHERE
LENGTH(sentence) > 0
AND (language = 'en' OR language = 'de')
GROUP BY id
HAVING COUNT(language) = 2
我只得到德语句子的结果。那我会的
SELECT
*
FROM
sentences
WHERE
id IN (SELECT
id
FROM
`sentences`
WHERE
LENGTH(sentence) > 0
AND (language = 'en' OR language = 'de')
GROUP BY id
HAVING COUNT(language) = 2)
这应该是可行的,但查询需要永远的时间。我的问题:有什么特别的方法可以做到这一点吗?内部联接比使用IN子句更快
SELECT en.id,
en.sentence as en_sentence,
de.sentence as de_sentence,
en.language as en_language,
de.language as de_language
FROM sentences en
INNER JOIN sentences de ON en.ID = de.ID AND en.language = 'en' AND de.language = 'de'
WHERE length(en.sentence) > 0
AND length(de.sentence) > 0
内部联接比使用IN子句更快
SELECT en.id,
en.sentence as en_sentence,
de.sentence as de_sentence,
en.language as en_language,
de.language as de_language
FROM sentences en
INNER JOIN sentences de ON en.ID = de.ID AND en.language = 'en' AND de.language = 'de'
WHERE length(en.sentence) > 0
AND length(de.sentence) > 0
如果数据允许,删除长度为0的句子。运行前备份:
DELETE FROM sentences WHERE LENGTH(SENTENCE) = 0
拿出select*,然后得到你想要的一切。如果没有索引,请在语言和id上添加一个组合索引
这就给你留下了
SELECT
ID, sentence, language.
FROM
`sentences`
WHERE
language = 'en' OR language = 'de'
GROUP BY id
HAVING COUNT(language) = 2
如果数据允许,删除长度为0的句子。运行前备份:
DELETE FROM sentences WHERE LENGTH(SENTENCE) = 0
拿出select*,然后得到你想要的一切。如果没有索引,请在语言和id上添加一个组合索引
这就给你留下了
SELECT
ID, sentence, language.
FROM
`sentences`
WHERE
language = 'en' OR language = 'de'
GROUP BY id
HAVING COUNT(language) = 2
由Tin Tran的答案定义。由Tin Tran的答案定义。是的,但函数不能使用索引,因此可能还有进一步优化的空间,如像其他答案一样删除空数据是的,但函数不能使用索引,因此,可能还有进一步优化的空间,比如像其他答案一样删除空数据删除空数据。但是,按ID分组将丢失其他语言的句子和语言,您希望这种情况发生。我和你之间的取舍是我可以用更多的语言来发展我的语言,增加计数并将语言更改为IN,而不更改代码,但是我必须进行计数。但是代码必须处理语言…对于这个组,不能保证你得到的是哪种语言,它只选择一种语言,having条款处理了这个问题。我假设语言和Id有一个唯一的索引。不,我的意思是你可以得到一个英语句子和另一个德语句子,所以没有办法使用这些数据…除了Id,你最好只选择Id,然后再进行另一次查询,以获取你需要的语言删除空数据的建议。但是,按ID分组将丢失其他语言的句子和语言,您希望这种情况发生。我和你之间的取舍是我可以用更多的语言来发展我的语言,增加计数并将语言更改为IN,而不更改代码,但是我必须进行计数。但是代码必须处理语言…对于这个组,不能保证你得到的是哪种语言,它只选择一种语言,having条款处理了这个问题。我假设语言和Id有一个唯一的索引。不,我的意思是你可以得到一个英语句子和另一个德语句子,所以没有办法使用这些数据…除了Id,你最好只选择Id,然后再进行另一次查询,以获取所需的语言