Как получить только вхождения с более чем одним значением? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть следующая таблица в mysql:

transcription_id |  speaker |   sentence
---------------------------------------------------------
1918                  1         'hello, good morning'
1918                  2         'how are you'

Столбец speaker может быть только 1 или 2, transcription_id является ключом набора данных, поэтому он уникален.

Обычно один transcription_id имеет один говорящий (1 и 2), потому что разговор обычно ведется между двумя людьми, но есть случаи с одним говорящим, например transcription_id = 1921:

transcription_id |  speaker |   sentence
--------------------------------------------------------
1920                  1         'hello, good morning'
1920                  2         'hi!'
**1921                1         'good night' <----------------------**
1922                  1         'hello, good morning'
1922                  2         'buenas notches!'

Как выбрать только те предложения, в которых есть оба говорящих?

Ответы [ 5 ]

0 голосов
/ 04 июня 2019

Если данные в таблице не содержат один и тот же speaker дважды для одного и того же transcription_id, тогда вы можете использовать следующий запрос MySQL

SELECT * FROM speakers WHERE transcription_id IN ( SELECT transcription_id FROM speaker group by transcription_id having count(*) = 2);

0 голосов
/ 04 июня 2019

Вы можете получить transcription_id с группировкой по transcription_id и условию having count(distinct speaker) = 2:

select *
from tablename
where transcription_id in (
  select transcription_id 
  from tablename
  group by transcription_id
  having count(distinct speaker) = 2
)
0 голосов
/ 04 июня 2019

Вы можете поместить их в одну строку, используя агрегацию:

select transaction_id, min(sentence), max(sentence)
from t
group by transaction_id;

Это помещает значения в одну строку.Если вам нужны отдельные строки, тогда ответ Йогеша правильный.

0 голосов
/ 04 июня 2019

Существует стандартное предложение SQL HAVING, позволяющее фильтровать группы по агрегированным значениям. В этом случае вы должны использовать HAVING COUNT(*) > 1, чтобы получить то, что требуется.

SELECT * 
  FROM transcription_table
 WHERE (transcription_id, speaker)
             IN (
                  SELECT transcription_id, speaker
                    FROM transcription_table
                    GROUP BY transcription_id, speaker
                   HAVING COUNT(*) > 1
);

В зависимости от того, что вы ищете, можно варьировать счет.

Например, используйте HAVING COUNT(DISTINCT SPEAKER) > 1, чтобы исключить повторяющиеся колонки.

0 голосов
/ 04 июня 2019

Вы можете использовать EXISTS:

SELECT t.*
FROM table t
WHERE t.speaker in (1, 2) AND
      EXISTS (SELECT 1 
              FROM table t1 
              WHERE t1.transcription_id = t.transcription_id AND t1.speaker <> t.speaker
             );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...