So geben Sie eine Beispielzeile nach der anderen aus der Datenbank zurück

Auf der Webseite sollte ein Produktbild für eine bestimmte Produktkategorie aus der PostgreSql-Datenbank angezeigt werden. Dieses Bild sollte alle 25 Sekunden automatisch in ein anderes Bild geändert werden. Das zurückgegebene Produkt kann zufällig oder in einer bestimmten Reihenfolge sein. Einige Produkte fehlen möglicherweise und einige wiederholen sich, aber die meisten Produkte in den Kriterien sollten zurückgegeben werden. Die Gesamtzahl der verfügbaren Bilder kann sich zwischen dem Abrufen der Probe geringfügig ändern

Derzeit wird der folgende Code verwendet, der alle 25 Sekunden ausgeführt wird. Dies erfordert zwei Datenbankabfragen: eine für die Zählung, die langsam sein kann, und eine für das Abrufen einzelner Bilder. In beiden Fällen, in denen Klauseln dupliziert werden, sind in einer realen Anwendung, in der Klauseln sehr umfangreich sind und Änderungen erforderlich sind, Änderungen an zwei Stellen.

Wie kann dies verbessert werden, damit eine einzelne Abfrage ein Beispiel zurückgibt? Spaltentypen können nicht geändert werden, es werden natürliche Primärschlüssel verwendet. Zusätzliche Spalten, Trigger, Indizes und Sequenzen können hinzugefügt werden, wenn dies hilft.

ASP.NET/Mono MVC3, npgsql werden verwendet.

$count = select count(*)
         from products
         where prodtype=$sometype and productid in (select productid from images);

$random = next random integer between 0 .. $count-1;

--  $productsample  is result: desired sample product
$productsample = select product
          from products
          where prodtype=$sometype and productid in (select productid from images)
          offset $random
          limit 1;


create table products ( productid char(20) primary key,
   prodtype char(10) references producttype 
);

create table images(
id serial primary key, 
productid char(20) references products,
mainimage bool
);

Antworten auf die Frage(2)

Ihre Antwort auf die Frage