Bei der Verwendung der Gruppenfunktion zum Filtern der Ergebnismenge sind einige Probleme und Lösungen aufgetreten [Empfohlen: MySQL-Video-Tutorial]
1. Anwendungsszenarien
Es gibt zwei Tabellen
Article-Tabelle (Eins-zu-viele-Nachrichtentabelle) t_posts:
oid, posts_name
Nachrichtentabelle (viele-zu-eins-Artikeltabelle) t_comment:
oid, posts_id, msg_content, create_time
2. Anforderungsanalyse
Fragen Sie den neuesten Antwortinhalt jedes Artikels ab. 3. SQL-Schreiben im Einklang mit dem Folgenden)
select tp.oid, tp.posts_name, tc.msg_content, tc.create_time from t_posts tp left join t_comment tc on tp.oid = tc.posts_id group by tp.oid having create_time = max(create_time)
4. Transformieren Sie die SQL
, da sie weiß, dass sie nach der Gruppierung zusammengeführt wird. Die wiederholte Ergebnismenge ist die mit der kleinsten Zeilennummer. Können wir die SQL also wie folgt ändern??
<p>A有一个回复记录时间为: 2019-09-10 <br>A有一个回复记录时间为: 2019-09-11 <br>B有一个回复记录时间为: 2019-09-01 <br>B有一个回复记录时间为: 2019-09-09<br></p>
Nachdem ich es ausgeführt habe, stellte ich fest, dass es immer noch nicht funktioniert, was beweist, dass „Order by“ nach „Group by“ und „Having“ folgt Die gruppierten Ergebnisse? 5. Die ultimative modifizierte Version aber die Unterabfrage wird tatsächlich zuerst sortiert
Nach der Abfrage (Erklärung) wird festgestellt, dass die Reihenfolge der Unterabfrage optimiert wurde:
Verwenden Sie den Grenzwert 99999 in der Unterabfrage.
Verwenden Sie die Where-Bedingung in der Unterabfrage. create_time = (wählen Sie max(create_time) aus der t_comment-Gruppe nach OID aus)select
tp.oid,
tp.posts_name,
tc.msg_content,
tc.create_time
from t_posts tp
left join t_comment tc on tp.oid = tc.posts_id
group by tp.oid having create_time = max(create_time)
-- 下面的是新增的sql
order by tc.create_time desc
Zusätzliche Wissenspunkte:
Unterschied zwischen den Versionen mysql5.5 und mysql 5.7: Version 5.7+, wenn das Limit nicht verwendet wird, gruppieren nach wird die Reihenfolge optimieren bis