문제

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',
);
도움이 되었습니까?

해결책

좋은 것으로 표시된 솔루션은 결과 테이블 만 반환합니다. 그러나 다음 쿼리를 수행하면 실패합니다.

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

할 것이다 사용자 만 반환합니다 고양이와 개 테이블이 아닙니다.

최상의 솔루션은 좋은 파서를 찾는 것입니다. 다른 솔루션은 Regex를 사용하고 쿼리를 설명하는 것입니다 (다음 링크의 추가 정보).

쿼리에 MySQL 테이블을 가져옵니다

그러나 나는 또 다른 좋은 해결책은 생각합니다 모든 테이블을 나열하고 쿼리 내부에서 검색하십시오, 테이블 목록을 캐시 할 수 있습니다.

편집하다: 테이블을 검색 할 때는 preg와 같은 것을 더 잘 사용하십시오.

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

그렇지 않은 경우 "table_name2", "table_name3"... ... table_name은 발견됩니다.

다른 팁

예, 쿼리 결과의 일부인 테이블 및 열에 대한 정보를 얻을 수 있습니다. 이것은 ... 불리운다 결과 세트 메타 데이터.

MySQL 결과 세트 메타 데이터를위한 유일한 PHP 솔루션은 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";

필드를 반복하여 쿼리에 사용 된 별개의 테이블 배열을 구축해야합니다.

사용하는 내용에 따라 MySQL의 설명은 다음을 위해 트릭을 수행 할 수 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top