Ho incontrato di recente questo problema. Il problema consisteva in due parti da risolvere. Per prima cosa ho dovuto usare una di selezione interna nella mia clausola FROM che ha fatto il mio limitante e compensazione per me sulla chiave primaria unica:
$subQuery = DB::raw("(SELECT id FROM titles WHERE id BETWEEN {$startId} AND {$endId} ORDER BY title) as t");
quindi ho potuto utilizzare che come da parte della mia interrogazione:
'titles.id',
'title_eisbns_concat.eisbns_concat',
'titles.pub_symbol',
'titles.title',
'titles.subtitle',
'titles.contributor1',
'titles.publisher',
'titles.epub_date',
'titles.ebook_price',
'publisher_licenses.id as pub_license_id',
'license_types.shortname',
$coversQuery
)
->from($subQuery)
->leftJoin('titles', 't.id', '=', 'titles.id')
->leftJoin('organizations', 'organizations.symbol', '=', 'titles.pub_symbol')
->leftJoin('title_eisbns_concat', 'titles.id', '=', 'title_eisbns_concat.title_id')
->leftJoin('publisher_licenses', 'publisher_licenses.org_id', '=', 'organizations.id')
->leftJoin('license_types', 'license_types.id', '=', 'publisher_licenses.license_type_id')
La prima volta che ho creato questa query avevo usato OFFSET e LIMIT in MySql. Questo ha funzionato bene fino a quando ho superato pagina 100, quindi l'offset ha iniziato a diventare insopportabilmente lento. Cambiarlo in BETWEEN nella mia query interna lo ha accelerato per qualsiasi pagina. Non sono sicuro del motivo per cui MySql non ha accelerato lo OFFSET ma tra sembra riavvolgerlo.
questo approccio funziona solo in istruzioni selezionate che non contengono la condizione. a mio parere non è una buona soluzione. –
Come mantenere aggiornata questa tabella indice? Nel mio caso, devo ordinare per colonna datetime e utilizzare offset consistenti con query lente. Se creo questa tabella suport, dovrò reinserire ogni volta che ho una nuova data, poiché non è in ordine. Ho già visto questa soluzione, ma con tabelle temporanee. –