SQL - تحديد الجدول المصدر من استعلام UNION
سؤال
أقوم بإنشاء موجز RSS بلغة PHP والذي يستخدم البيانات من ثلاثة جداول منفصلة.تشير جميع الجداول إلى صفحات ضمن مناطق مختلفة من الموقع.المشكلة التي أواجهها هي محاولة إنشاء حقول الارتباط داخل ملف XML.بدون معرفة الجدول الذي جاء منه كل سجل، لا أستطيع إنشاء الرابط الصحيح له.
هل هناك طريقة لحل هذه المشكلة؟لقد حاولت استخدام mysql_fetch_field، لكنه أعاد قيمًا فارغة للجداول.
$sql = "
SELECT Title FROM table1
UNION
SELECT Title FROM table2
UNION
SELECT Title FROM table3";
هناك مجالات أخرى معنية، ولكن هذا هو الاستعلام الذي أستخدمه بشكل أساسي.
سيكون موضع تقدير أي مساعدة.
شكرًا.
المحلول
وينبغي أن يكون من السهل بما فيه الكفاية، فقط تفعل شيئا من هذا القبيل:
$sql = "
SELECT Title, 1 FROM table1
UNION ALL
SELECT Title, 2 FROM table2
UNION ALL
SELECT Title, 3 FROM table3";
نصائح أخرى
وأضيف ثابت إلى قائمة الأعمدة كما يلي:
select 'table1' as table_name, title from table1
union all
select 'table2' as table_name, title from table2
union all
select 'table3' as table_name, title from table3
والتي سوف تحصل على شيء من هذا القبيل:
table_name | title
-----------+-----------------------------
table1 | war and peace
table2 | 1984
table3 | terminator salvation
ووهلم جرا.
وهذا يتيح لك الحصول على أنواع البيانات سلسلة التي من المرجح أن تجعل التحويل إلى وصلات أسهل (خاصة إذا كنت تستخدم القيم التي لديها فقط ليتم نسخها إلى صفحتك بدلا من البحث عنها أو تحويلها) وذلك باستخدام شرط as
سماح لك مرجع له مثل أي عمود آخر (حسب الاسم).
لاحظ استخدام union all
- إذا كنت على يقين من أنه لن يكون هناك أية صفوف مكررة من الجداول (والذي هو ربما م> صحيح في هذه الحالة لأن لديك قيمة table_name
مختلفة لكل وI 'م على افتراض العناوين هي فريدة من نوعها)، وunion all
يمكن تجنب إهدار عملية الفرز، وإزالة مكررة. استخدام union
من تلقاء نفسها قد يسبب العمل الضروري أن يتم.
إذا كنت ترغب في إزالة مكررة القيام به، ومجرد العودة إلى استخدام union
.
وإضافة عمود وهمية مع فالى المستمر. على سبيل المثال. "اختر" funky_table 'كما source_table، العنوان من funky_table "لكل بند ولكن بأسماء مختلفة في الاقتباس.
يعمل الاستعلام أدناه بشكل أفضل ويمنحك فكرة أفضل لأن الاستعلامات المذكورة أعلاه لا تعرض الصفوف مرتين.
SELECT t1.*,t1.table_name
FROM
t1
UNION ALL
SELECT t2.*,t2.table_name
FROM
t2
LEFT OUTER JOIN
t1
ON t1.id=t2.id
WHERE t1.id=null
البرنامج النصي أعلاه لا يعطي صفوف بيانات مكررة وتأكد من ذلك
- كافة البيانات المشتركة بين t1 وt2 كجدول t1 المصدر.
- مصدر الصفوف غير t2 كجدول t1.
- مصدر الصفوف غير t1 كجدول t2.
إذا كنت تريد بيانات مشتركة من جدول t2، فاقلب الرابط لليسار