How to sort duplicate rows in a key-value pair table on multiple columns in MySQL?
P粉115840076
2023-09-05 18:21:40
<p>So I have the following table of key/value pairs, the user submits data via the form, and each question on the form is added to the table here as a separate row. <code>Submission_id</code> identifies each form submission. </p>
<pre class="brush:php;toolbar:false;"> ---- --------------- --------------- --------
| id | submission_id | key | value |
---- --------------- --------------- --------
| 1 | 10 | manufacturer | Apple |
| 2 | 10 | model | 5s |
| 3 | 10 | firstname | Paul |
| 4 | 15 | manufacturer | Apple |
| 5 | 15 | model | 5s |
| 6 | 15 | firstname | Paul |
| 7 | 20 | manufacturer | Apple |
| 8 | 20 | model | 5s |
| 9 | 20 | firstname | Andrew |
---- --------------- -------------- -------- </pre>
<p>As can be seen from the above data, the commits with id 10 and 15 have the same value (just the commit ids are different). This is basically because the user submitted the same form twice, so it's a duplicate. </p>
<p>I'm trying to find a way to sort these tables so that any duplicate submissions appear together in order. Given the table above, I'm trying to construct a query that gives me the following results: </p>
<pre class="brush:php;toolbar:false;"> ---------------
| submission_id |
---------------
| 10 |
| 15 |
| 20 |
--------------- </pre>
<p>So I want to check if a commit has the same value for the <code>manufacturer</code>, <code>model</code> and <code>firstname</code> keys. If so, then they get the commit id and they are placed adjacent to each other in the results. There are other keys in the actual table, but I only want to match duplicates based on these 3 keys (manufacturer, model, firstname). </p>
<p>I've been thinking about this for a long time and trying to find some possible solutions, but haven't found anything reliable. </p>
This is not a key-value table. Often called entity-attribute-value table/relationship/schema.
Looking at the problem, if the tables were arranged in regular first and second normal form, this would be trivial - just concatenate the values, group by those values, and count....
Or use connection....
Or use sorting and comparing adjacent rows....
So the solution is to simply make your data look like a normal relationship....
Hopefully concatenation and sequence based solutions should be obvious now.