如何在mysql中找到多列中具有相同值的行

如何在mysql中找到多列中具有相同值的行,mysql,Mysql,有一个表包含972561行(记录)和8列(属性)。格式如下所示: +--------------+------+-------------+------------+--------------+-----------+-----------+-------------+ | PREDICATE_ID | PMID | SENTENCE_ID | SUBJECT_ID | SUBJECT_NAME | PREDICATE | OBJECT_ID | OBJECT_NAME | +--------

有一个表包含972561行(记录)和8列(属性)。格式如下所示:

+--------------+------+-------------+------------+--------------+-----------+-----------+-------------+
| PREDICATE_ID | PMID | SENTENCE_ID | SUBJECT_ID | SUBJECT_NAME | PREDICATE | OBJECT_ID | OBJECT_NAME |
+--------------+------+-------------+------------+--------------+-----------+-----------+-------------+
我想过滤主语、谓语和宾语值只出现一次的录音。例如,一个表中有四个录音。应将最后一次录制从结果中排除,因为(Bob,is_a,Person)只出现一次

+--------------+------+-------------+------------+--------------+-----------+-----------+-------------+
| PREDICATE_ID | PMID | SENTENCE_ID | SUBJECT_ID | SUBJECT_NAME | PREDICATE | OBJECT_ID | OBJECT_NAME |
+--------------+------+-------------+------------+--------------+-----------+-----------+-------------+
| 1            | 100  | 1           | 2          | Bob          | is_born_in| 3         | 1994        |
+--------------+------+-------------+------------+--------------+-----------+-----------+-------------+
| 1            | 103  | 3           | 2          | Bob          | is_born_in| 3         | 1994        |
+--------------+------+-------------+------------+--------------+-----------+-----------+-------------+
| 1            | 102  | 5           | 2          | Bob          | is_born_in| 3         | 1994        |
+--------------+------+-------------+------------+--------------+-----------+-----------+-------------+
| 2            | 104  | 2           | 2          | Bob          | is_a      | 4         | Person      |
+--------------+------+-------------+------------+--------------+-----------+-----------+-------------+

任何帮助都将不胜感激

使用聚合,我们可以尝试:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT SUBJECT_ID, PREDICATE_ID, OBJECT_ID
    FROM yourTable
    GROUP BY SUBJECT_ID, PREDICATE_ID, OBJECT_ID
    HAVING COUNT(*) > 1
) t2
    ON t1.SUBJECT_ID = t2.SUBJECT_ID AND
       t1.PREDICATE_ID = t2.PREDICATE_ID AND
       t1.OBJECT_ID = t2.OBJECT_ID;
如果您使用的是MySQL 8+,我们可以利用分析功能实现更简洁的查询:

WITH cte AS (
    SELECT *, COUNT(*) OVER (PARTITION BY BY SUBJECT_ID, PREDICATE_ID, OBJECT_ID) cnt
    FROM yourTable
)

SELECT *
FROM cte
WHERE cnt > 1;

过滤或删除,如您希望从查询结果中排除它们,或完全从表中删除它们?我希望排除它们@MichaelNovello为什么一个表要同时存储主语id和主语-谓词和宾语也是如此!?!?!?您从哪里获得
t2
?看起来他只是在用一张桌子,我在用。它似乎起作用了。因为桌上有太多的录音,所以需要时间。将在结果返回后接受它。非常感谢。