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
);