元ネタは、コチラ。
$tables = array();
if (preg_match_all("/(.*\s+from\s+(\w+(\.\w+)?).*)|(.*\s+join\s+(\w+(\.\w+)?).*)/i", $sqlstr, $matches)) {
foreach($matches as $varry) {
if (is_array($varry)) {
foreach($varry as $v) {
if (!empty($v)
&& !preg_match("/^(\.)|(\s*)(SELECT|JOIN|FROM).*/i", $v)) {
$tables[] = $v;
}
}
} else {
if (!empty($varry)
&& !preg_match("/^(\.)|(\s*)(SELECT|JOIN|FROM).*/i", $varry)) {
$tables[] = $varry;
}
}
}
}
正規表現一発でテーブル名を取得しようと思っても、
サブクエリ使ってたりJOIN使ってたりしたら、
なかなか上手くいかないですよね。。。
正規表現一発ではうまくいかなくても
何とか取って来れないかと試行錯誤しました。
なんとか取得できてるっぽいです。
↓こんなSQLでもちゃんとテーブル名だけを返してくれます。
SELECT
a.usage_amount -- test1
,b.charge #test2
,c.* /*
test3
*/
from (
SELECT shop_id, sum(usage_amount) as usage_amount
FROM v0.usagex
GROUP BY (shop_id)
) a
LEFT OUTER JOIN (
SELECT shop_id, sum(charge) as charge
FROM v0.history
GROUP BY (shop_id)
)b on a.shop_id = b.shop_id
INNER JOIN v0.contract c on c.shop_id = a.shop_id
※↑この例の場合、先のコーディングで、$tablesには
・v0.usagex
・v0.history
・v0.contract
が返されます。
0 件のコメント:
コメントを投稿
どうかお気軽にコメント頂ければ幸いです。