SQL - تحديد الجدول المصدر من استعلام UNION

StackOverflow https://stackoverflow.com/questions/1404890

  •  05-07-2019
  •  | 
  •  

سؤال

أقوم بإنشاء موجز 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

البرنامج النصي أعلاه لا يعطي صفوف بيانات مكررة وتأكد من ذلك

  1. كافة البيانات المشتركة بين t1 وt2 كجدول t1 المصدر.
  2. مصدر الصفوف غير t2 كجدول t1.
  3. مصدر الصفوف غير t1 كجدول t2.

إذا كنت تريد بيانات مشتركة من جدول t2، فاقلب الرابط لليسار

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top