Hallo zusammen! Könnt ihr mir bitte helfen? Ich beiß mir hierbei gerade die Zähne aus...
Ich soll ein php Script überarbeiten, das in einer Funktion eine SQL-Abfrage (Oracle) erzeugt. Diese Funktion soll Objekte aus der Datenbank zurückgeben in Abhängigkeit von einem Parameter 'Filter', der ein Array aus Integers ist. Es fand ausserdem eine Vorselektierung statt nach weiteren Filtern, dieses liegt ebenfalls als Integer Array vor.
Pseudocode:
Das Script tut auch was es soll, jedoch wird der Query-String ab 3 Filtern (von bis zu 20 möglichen Filtern) unfassbar groß und dementsprechend auch langsamer, hier ein Beispiel einer solchen Query, wenn $filterIDs [81,82] ist und die Vorselektion ergeben hat, dass nur Objecte mit den IDs [32,51] berücksichtigt werden sollen:
Die Vorselektierung besteht allerdings oft nicht nur aus 2 IDs, sondern aus über 100, was bedeutet, dass die Zeilen 5 und 6 schonmal über 100mal mit der jeweiligen IDs vorkommen. Und das für nur 2 gesetzte Filter!
Im Prinzip geht es doch, wenn ich das Skript richtig verstanden habe, darum:
select object_ID FROM ... WHERE object_ID in (Vorselektion) AND (alle gesuchten Filter sind für diese ID gesetzt)
der letzte Punkt ist natürlich das kritische. Die Lookuptable sieht wie folgt aus:
object_ID|filter_ID
32|81
51|82
32|82
51|100
11|101
11|81
10|100
Bei diesen Daten würde obige Funktion also nur die objectID 32 ausspucken, da nur für ID 32 die FilterID 81 und 82 vorhanden sind.
Wie kann man soeine Selektion effizienter machen als mit dem obigen Ansatz? Ich hoffe ich habe den Spagat geschafft und es nicht zu vage und nicht zu detailliert beschrieben :/
Viele Grüße
Christian
Ich soll ein php Script überarbeiten, das in einer Funktion eine SQL-Abfrage (Oracle) erzeugt. Diese Funktion soll Objekte aus der Datenbank zurückgeben in Abhängigkeit von einem Parameter 'Filter', der ein Array aus Integers ist. Es fand ausserdem eine Vorselektierung statt nach weiteren Filtern, dieses liegt ebenfalls als Integer Array vor.
Pseudocode:
PHP:
function getObjects(int[] filterIDs, int[] objectIDsVorselektion)
{
$query = //dynamisch zusammengeaubt unter Berücksichtigung
//der filterIDs und Vorselektion
return $sql->Execute($query)
}
Das Script tut auch was es soll, jedoch wird der Query-String ab 3 Filtern (von bis zu 20 möglichen Filtern) unfassbar groß und dementsprechend auch langsamer, hier ein Beispiel einer solchen Query, wenn $filterIDs [81,82] ist und die Vorselektion ergeben hat, dass nur Objecte mit den IDs [32,51] berücksichtigt werden sollen:
Code:
"SELECT O.object_ID FROM objects O LEFT JOIN lookuptable A
ON A.ad_ID = O.object_ID WHERE (
A.ad_ID = 32 AND A.filter_ID = 82 AND EXISTS
(SELECT * FROM lookuptable B WHERE filter_ID = 81 AND B.ad_ID = 32))
OR (A.ad_ID = 51 AND A.filter_ID = 82 AND EXISTS
(SELECT * FROM lookuptable B WHERE filter_ID = 81 AND B.ad_ID = 51))
AND O.object_ID IN (32,51)
ORDER BY O.time ASC
Die Vorselektierung besteht allerdings oft nicht nur aus 2 IDs, sondern aus über 100, was bedeutet, dass die Zeilen 5 und 6 schonmal über 100mal mit der jeweiligen IDs vorkommen. Und das für nur 2 gesetzte Filter!
Im Prinzip geht es doch, wenn ich das Skript richtig verstanden habe, darum:
select object_ID FROM ... WHERE object_ID in (Vorselektion) AND (alle gesuchten Filter sind für diese ID gesetzt)
der letzte Punkt ist natürlich das kritische. Die Lookuptable sieht wie folgt aus:
object_ID|filter_ID
32|81
51|82
32|82
51|100
11|101
11|81
10|100
Bei diesen Daten würde obige Funktion also nur die objectID 32 ausspucken, da nur für ID 32 die FilterID 81 und 82 vorhanden sind.
Wie kann man soeine Selektion effizienter machen als mit dem obigen Ansatz? Ich hoffe ich habe den Spagat geschafft und es nicht zu vage und nicht zu detailliert beschrieben :/
Viele Grüße
Christian