sql >> Databasteknik >  >> RDS >> PostgreSQL

Effektiv senaste postfråga med Postgresql

Om du inte vill ändra din datamodell kan du använda DISTINCT ON för att hämta den senaste posten från tabell "b" för varje post i "a":

SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC

Om du vill undvika en "sortering" i frågan kan du lägga till ett index som detta kan hjälpa dig, men jag är inte säker:

CREATE INDEX b_id_date ON b (id, date DESC)

SELECT DISTINCT ON (b.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY b.id, b.date DESC

Alternativt, om du vill sortera poster från tabell "a" på något sätt:

SELECT DISTINCT ON (sort_column, a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY sort_column, a.id, b.date DESC

Alternativa tillvägagångssätt

Men alla ovanstående frågor måste fortfarande läsa alla refererade rader från tabell "b", så om du har mycket data kan det fortfarande gå för långsamt.

Du kan skapa en ny tabell som bara innehåller den senaste "b"-posten för varje a.id -- eller till och med flytta dessa kolumner till själva "a"-tabellen.



  1. Komplex Postgres-fråga

  2. Konvertera MySQL-skript till H2

  3. PHP och MySQL - Kontrollera om användarnamnet redan är upptaget

  4. Kan jag uppdatera den nyss tillagda raden med MySQL-utlösare