Перечислять таблицы, используемые в запросе MySQL? - PullRequest
2 голосов
/ 11 апреля 2009

Есть ли способ перечислить таблицы, используемые в запросе mysql?

Допустим, у меня есть запрос:

SELECT * FROM   db_people.people_facts pf
INNER JOIN db_system.connections sm ON sm.source_id = pf.object_id
INNER JOIN db_people.people p ON sm.target_id = p.object_id
ORDER BY pf.object_id DESC

А я хочу в возвращаемом массиве:

$tables = array(
[0] => 'db_people.people_facts',
[1] => 'db_system.connections',
[2] => 'db_people.people',
);

Ответы [ 3 ]

4 голосов
/ 11 апреля 2009

Да, вы можете получить информацию о таблицах и столбцах, которые являются частью результата запроса. Это называется метаданные набора результатов .

Единственное решение PHP для метаданных набора результатов MySQL - это использование расширения MySQLi и функции mysqli_stmt::result_metadata().

$stmt = $mysqli->prepare("SELECT * FROM   db_people.people_facts pf
  INNER JOIN db_system.connections sm ON sm.source_id = pf.object_id
  INNER JOIN db_people.people p ON sm.target_id = p.object_id
  ORDER BY pf.object_id DESC");

$meta = $stmt->result_metadata();

$field1 = $meta->fetch_field();

echo "Table for field " . $field1->name . " is " . $field1->table . "\n";

Вам нужно будет самостоятельно создать массив отдельных таблиц, используемых в запросе, циклически перебирая поля.

1 голос
/ 11 апреля 2009

В зависимости от того, для чего вы его используете, MySQL EXPLAIN может помочь вам:

http://dev.mysql.com/doc/refman/5.0/en/explain.html

0 голосов
/ 04 августа 2010

Решение, помеченное как хорошее, вернет только таблицы результатов. Но если вы выполните следующий запрос, он потерпит неудачу:

SELECT users.* FROM users, cats, dogs WHERE users.id = cats.user_id

Будет возвращать только пользователей , а не таблицы кошек и собак.

Лучшее решение - найти хороший парсер, другое решение - использовать запрос REGEX и EXPLAIN (подробнее по следующей ссылке):

Получение таблиц mysql в запросе

Но я думаю, что другим хорошим решением является перечисление всех таблиц и поиск их внутри запроса , вы можете кэшировать список таблиц.

РЕДАКТИРОВАТЬ : при поиске таблиц лучше использовать прег, например:

// (`|'|"| )table_name(\1|$)
if(preg_match('/(`|\'|"| )table_name(\1|$)/i', $query))
    // found

Если нет, он может возвращать ложные срабатывания, например, "table_name2", "table_name3" ... table_name вернет FOUND два раза.

...