Ich möchte Zeilen mit einer bestimmten E-Mail-Adresse auswählen (siehe Beispieltabelle unten):

Tabellenname = Benutzer

 +----+---------+-------------------+-------------+
   | id | title   | email             | commentname |
   +----+---------+-------------------+-------------+
   |  3 | test    | rob@hotmail.com   | rob         |
   |  4 | i agree | rob@hotmail.com   | rob         |
   |  5 | its ok  | rob@hotmail.com   | rob         |
   |  6 | hey     | rob@hotmail.com   | rob         |
   |  7 | nice!   | simon@hotmail.com | simon       |
   |  8 | yeah    | john@hotmail.com  | john        |
   +----+---------+-------------------+-------------+

Das gewünschte Ergebnis wäre:

 +----+-------+-------------------+-------------+
   | id | title | email             | commentname |
   +----+-------+-------------------+-------------+
   |  5 | its ok| rob@hotmail.com   | rob         |
   |  7 | nice! | simon@hotmail.com | simon       |
   |  8 | yeah  | john@hotmail.com  | john        |
   +----+-------+-------------------+-------------+

Der eindeutige Wert sollte der letzte Eintrag im Tabellenbeispiel id = 6 sein. Was wäre das erforderliche SQL?

0
Aadil Shaikh 18 Jän. 2019 im 13:35

3 Antworten

Beste Antwort

Wenn Sie MySQL 5.7 oder früher verwenden, können Sie Ihre Tabelle mit einer Unterabfrage verknüpfen, die den neuesten Datensatz für jede E-Mail findet:

SELECT t1.id, t1.title, t1.email, t1.commentname
FROM yourTable t1
INNER JOIN
(
    SELECT email, MAX(id) AS latest_id
    FROM yourTable
    GROUP BY email
) t2
    ON t1.email = t2.email AND t1.id = t2.latest_id;

Wenn Sie MySQL 8+ verwenden, verwenden Sie hier einfach ROW_NUMBER:

WITH cte AS (
    SELECT id, title, email, commentname,
        ROW_NUMBER() OVER (PARTITION BY email ORDER BY id DESC) rn
    FROM yourTable
)

SELECT id, title, email, commentname
FROM cte
WHERE rn = 1;

Hinweis: Ihre erwartete Ausgabe hat wahrscheinlich ein Problem, und der Datensatz id = 6 ist der neueste für rob@hotmail.com.

4
Tim Biegeleisen 18 Jän. 2019 im 10:40

Sie können es unten mit einer korrelierten Unterabfrage versuchen

select * from table1 a
where id in (select max(id) from table1 b where a.email=b.email group by b.email)
1
Fahmi 18 Jän. 2019 im 10:44

Wenn 'id' ein eindeutiger oder Primärschlüssel ist, können Sie diesen verwenden:

select * from Users where id in (select max(id) from Users group by commentname)

Oben würde Ihre Datenbankleistung verbessern, da die korrelierten Unterabfragen von der stammen Tatsache, dass die Unterabfrage Informationen aus der äußeren Abfrage verwendet und die Unterabfrage einmal für jede Zeile in der äußeren Abfrage ausgeführt wird. Daher empfehle ich Ihnen, meine Antwort zu verwenden, wenn 'id' eindeutig ist.

0
劉鎮瑲 3 Aug. 2019 im 15:54