如何仅获取具有多个值的事件?

时间:2019-06-04 12:30:16

标签: mysql sql

我在mysql中有下表:

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

speaker列只能为1或2,transcription_id是数据集的键,因此它是唯一的。

通常情况下,一个transcription_id拥有两个发言者(分别为1和2),因为对话通常在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 :(得分:0)

您可以使用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
             );

答案 1 :(得分:0)

您可以使用聚合将它们放在一排:

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

这会将值放在一行中。如果您要单个行,那么Yogesh的答案是正确的。

答案 2 :(得分:0)

有一个标准的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排除可重复的说话者。

答案 3 :(得分:0)

您可以按转录_id和条件transcription_idhaving 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
)

答案 4 :(得分:0)

如果表中的数据对于相同的speaker两次不包含相同的transcription_id,则可以使用以下MySQL查询

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