سؤال

هل هناك أي طريقة لتعداد الطاولات المستخدمة في استعلام 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 مرتين.

نصائح أخرى

نعم، يمكنك الحصول على معلومات حول الجداول والأعمدة التي هي جزء من نتيجة الاستعلام. هذا يسمي النتيجة مجموعة البيانات الوصفية.

حل PHP الوحيد ل MySQL Stuing Set Metadata هو استخدام ملحق 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