Ich habe drei Tabellen, um Benutzer zu definieren:
USER: user_id (int), username (varchar)
USER_METADATA_FIELD: user_metadata_field_id (int), field_name (varchar)
USER_METADATA: user_metadata_field_id (int), user_id (int), field_value (varchar)
Ich möchte einen Benutzer der mittleren Ebene erstellen, der bestimmten Zugriff auf andere Benutzer in der Anwendung hat. Um festzustellen, auf welche Benutzer der angemeldete Benutzer zugreifen kann, verwende ich eine Unterabfrage wie die folgende:
SELECT user_id FROM user WHERE user_id
IN (SELECT user_id
FROM user_metadata
WHERE user_metadata_field_id = 1 AND field_value = 'foo')
Derzeit speichere ich die Unterabfragezeichenfolge in einer Variablen und füge sie dann jedes Mal dynamisch in die äußere Abfrage ein, wenn ich eine Liste von Benutzern abrufen muss. Danach dachte ich: "Es muss besser sein, nur eine Zeichenfolge der tatsächlichen user_id
s zu speichern ."
Also anstatt dies in einer Variablen zu speichern ...
$subSql = "SELECT user_id FROM user_metadata WHERE user_metadata_field_id = 1 AND field_value = 'foo'";
... Ich führe die Abfrage tatsächlich durch und speichere das Ergebnis so ...
$subSql = "12, 56, 89, 100, 1234, 890";
Wenn ich dann eine Anzahl von Benutzern abrufen muss, auf die der angemeldete Benutzer Zugriff hat, kann ich dies tun mit:
$sql = "SELECT user_id FROM user WHERE user_id IN ($subSql)";
Und zum Schluss die Fragen:
Wie viele Elemente können Sie in einer MySQL- IN
Klausel verwenden? Das Speichern der tatsächlichen IDs anstelle der Sub-SQL-Anweisung muss schneller sein, damit diese äußere Abfrage jedes Mal ausgeführt werden kann, oder?