Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 通过具有_Mysql_Group By_Having Clause - Fatal编程技术网

Mysql 通过具有

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

我有一个包含3列的表:id、句子和语言。所以句子可以是英语和德语,ID被分配给意思相同但语言不同的句子,比如

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,然后再进行另一次查询,以获取所需的语言