次のように、「WHERE」句からテーブルの親子関係を取得する必要があります。
select ... large list of fields with aliases ...
from ... list of joined tables ...
where ((`db_name`.`catalog`.`group` = `db_name`.`catalog_group`.`iden`)
and (`db_name`.`catalog`.`iden` = `db_name`.`catalog_sub`.`parent`))
各条件から識別子を取得する正規表現はありますか? 配列 element[0] = table の左側から、element[1] は右側からの table とします。Ident の名前は任意です。そのため、'where' 'and' '=' などの SQL 演算子のみがキーになる可能性があります。
どんな助けでも大歓迎です。
明らかにする
WHERE句でWHERE句から参照を取得したくありません。私はそのような参照が欲しいだけです。したがって、すべてのシーケンスを置き換える正規表現がある可能性があることがわかります
`.`
に
.
そして、バックティックされたすべてのペアを次のように一致させます
` @ ` = ` @ `
既定では、任意のクエリに常に存在する識別子の前後のバッククォート。デフォルトでは、二重引用符で囲まれたすべての文字列値。正規表現の第一人者にとっては複雑な作業ではないと思いました。前もって感謝します。
PS これは、myISAM エンジンが手動で強制的に復元した参照をサポートしていないためです。
終了:
public function initRef($q) {
$s = strtolower($q);
// remove all string values within double quotes
$s = preg_replace('|"(\w+)"|', '', $q);
// split by 'where' clause
$arr = explode('where', $s);
if (isset($arr[1])) {
// remove all spaces and parenthesis
$s = preg_replace('/\s|\(|\}/', '', $arr[1]);
// replace `.` with .
$s = preg_replace('/(`\.`)/', '.', $s);
// replace `=` with =
$s = preg_replace("/(`=`)/", "=", $s);
// match pairs within ticks
preg_match_all('/`.*?`/', $s, $matches);
// recreate arr
$arr = array();
foreach($matches[0] as &$match) {
$match = preg_replace('/`/', '', $match); // now remove all backticks
$match = str_replace($this->db . '.', '', $match); // remove db_name
$arr[] = explode('=', $match); // split by = sign
}
$this->pairs = $arr;
} else {
$this->pairs = 0;
}
}