如何在mysql中找到多列中具有相同值的行
有一个表包含972561行(记录)和8列(属性)。格式如下所示:如何在mysql中找到多列中具有相同值的行,mysql,Mysql,有一个表包含972561行(记录)和8列(属性)。格式如下所示: +--------------+------+-------------+------------+--------------+-----------+-----------+-------------+ | PREDICATE_ID | PMID | SENTENCE_ID | SUBJECT_ID | SUBJECT_NAME | PREDICATE | OBJECT_ID | OBJECT_NAME | +--------
+--------------+------+-------------+------------+--------------+-----------+-----------+-------------+
| 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
?看起来他只是在用一张桌子,我在用。它似乎起作用了。因为桌上有太多的录音,所以需要时间。将在结果返回后接受它。非常感谢。