Ich möchte Zeilen mit einem auswählen distinct email
, siehe folgende Beispieltabelle:
+----+---------+-------------------+-------------+
| id | title | email | commentname |
+----+---------+-------------------+-------------+
| 3 | test | [email protected] | rob |
| 4 | i agree | [email protected] | rob |
| 5 | its ok | [email protected] | rob |
| 6 | hey | [email protected] | rob |
| 7 | nice! | [email protected] | simon |
| 8 | yeah | [email protected] | john |
+----+---------+-------------------+-------------+
Das gewünschte Ergebnis wäre:
+----+-------+-------------------+-------------+
| id | title | email | commentname |
+----+-------+-------------------+-------------+
| 3 | test | [email protected] | rob |
| 7 | nice! | [email protected] | simon |
| 8 | yeah | [email protected] | john |
+----+-------+-------------------+-------------+
Wo es mir egal ist, welcher id
Spaltenwert zurückgegeben wird. Was wäre das erforderliche SQL?
sql-server
tsql
Flo
quelle
quelle
distinct
Schlüsselwort ist hier nicht erforderlich. Außerdem scheint es so, als würde ein Join-Onid
auch den Trick machen.Ich nehme an, Sie meinen , dass Sie kümmern sich nicht , welche Zeile die zu erhalten , verwendet wird
title
,id
undcommentname
Werte (Sie „rauben“ für alle Zeilen haben, aber ich weiß nicht , ob das etwas ist eigentlich, die durchgesetzt werden würde oder nicht in Ihrem Datenmodell). Wenn ja, können Sie Fensterfunktionen verwenden, um die erste Zeile für eine bestimmte E-Mail-Adresse zurückzugeben:select id, title, email, commentname from ( select *, row_number() over (partition by email order by id) as RowNbr from YourTable ) source where RowNbr = 1
quelle
Wenn Sie MySql 5.7 oder höher verwenden , können wir gemäß diesen Links ( MySql Official , SO QA ) einen Datensatz pro Datensatz auswählen,
group by
ohne dass Aggregatfunktionen erforderlich sind.Damit kann die Abfrage vereinfacht werden.
select * from comments_table group by commentname;
Probieren Sie die Abfrage hier in Aktion aus
quelle
Da es Ihnen egal ist, welche ID zurückgegeben werden soll, bleibe ich bei der MAX-ID für jede E-Mail, um die SQL-Abfrage zu vereinfachen. Probieren Sie es aus
;WITH ue(id) AS ( SELECT MAX(id) FROM table GROUP BY email ) SELECT * FROM table t INNER JOIN ue ON ue.id = t.id
quelle