Cześć
W pracy dostałem kawałek kodu przeszukujący bazę i mam się zastanowić czy da się go jakoś zoptymalizować.
Są 2 tabele:
textinfo
id - int
occtime - int
field
textinfo_id - int
field - int
value - varchar
Użytkownik przy wyszukiwaniu może określić przedział czasowy(occtime) oraz określić wartości(value) parametrów(field);
Kawałek kodu, który dostałem wygląda mniej więcej tak:
AnsiString sql = AnsiString()
+ "create temporary table t0 select id,occtime from textinfo"
+ " where occtime>=" + conn->addSlashesQuote (curTime.toNumericAnsiString())
+ " and occtime<=" + conn->addSlashesQuote (toTime.toNumericAnsiString());
if (actuallimit > 0)
sql = sql + " limit " + FINDLIMIT;
sql += ";";
conn->executeUpdate (sql);
sql = "select max(occtime) as occtime from t0";
rs = conn->executeQuery (sql);
if (rs->next())
curTime.fromNumericAnsiString (rs->getString("occtime"));
WDelete (rs);
TextInfoFieldValues::const_iterator it;
int i = 0;
for (it=values.begin(), i=0; it != values.end(); it++, i++)
{
sql = AnsiString()
+ "create temporary table t" + (i+1)
+ " select id,occtime from t" + i + ",field"
+ " where id=field.textinfo_id"
+ " and field=" + it->first
+ " and value like " + conn->addSlashesQuote(AnsiString ("%") + it->second + "%");
conn->executeUpdate (sql);
//conn->executeUpdate (AnsiString ("drop table t") + i);
}
rs = conn->executeQuery (AnsiString ()
+ "select id from t" + i
+ " order by occtime"
);
I teraz pewna istotna informacja. Baza stoi na MySQL 3.23.58. Chciałem wywalić wszystkie te tymczasowe tabele i powstawiać zapytania zagnieżdżone ale niestety wersja MySQL mi na to nie pozwala(zapytania zagnieżdżone dopiero od wersji 4.1). Macie jakiś inny pomysł na optymalne rozwiązanie tego wyszukiwania? Byłbym bardzo wdzięczny za jakiekolwiek pomysły.