P粉6595182942023-09-06 00:57:21
这不是一个键值表。通常被称为实体-属性-值表/关系/模式。
看问题,如果表按照常规的第一和第二范式排列,这将是微不足道的 - 只需对值进行连接,按照这些值进行分组,并进行计数....
SELECT manufacturer, model, firstname, COUNT(DISTINCT submission_id) FROM atable GROUP BY manufacturer, model, firstname HAVING COUNT(DISTINCT submission_id)>1;
或者使用连接....
SELECT a.manufacturer, a.model, a.firstname , a.submission_id, b.submission_id FROM atable a JOIN atable b ON a.manufacturer=b.manufacturer AND a.model=b.model AND a.firstname=b.firstname WHERE a.submission_id<b.submission_id ;
或者使用排序和比较相邻行....
SELECT * FROM ( SELECT @prev.submission_id AS prev_submission_id , @prev.manufacturer AS prev_manufacturer , @prev.model AS prev_model , @prev.firstname AS pref_firstname , a.submission_id , a.manufacturer , a.model , set @prev.submission_id:=a.submission_id as currsid , set @prev.manufacturer:=a.manufacturer as currman , set @prev.model:=a.model as currmodel , set @prev.firstname=a.forstname as currname FROM atable ORDER BY manufacturer, model, firstname, submission_id ) WHERE prev_manufacturer=manufacturer AND prev_model=model AND prev_firstname=firstname AND prev_submission_id<>submission_id;
所以解决方案就是简单地使您的数据看起来像一个正常的关系....
SELECT ilv.values , COUNT(ilv.submission_id) , GROUP_CONCAT(ilv.submission_id) FROM (SELECT a.submission_id , GROUP_CONCAT(CONCAT(a.key, '=',a.value)) AS values FROM atable a GROUP BY a.submission_id ) ilv GROUP BY ilv.values HAVING COUNT(ilv.submission_id)>1;
希望连接和基于序列的解决方案现在应该很明显。