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;
希望連接和基於序列的解決方案現在應該很明顯。