وظائف إجمالية - الحصول على الأعمدة غير المدرجة في جملة المجموعة
-
20-09-2019 - |
سؤال
لدي جدول لديه ثلاثة حقول (item_id، المصدر، والسعر). (item_id، المصدر، والسعر) معا تشكل المفتاح الأساسي.
item_id source price
------- ------- -----
1 paris 13
1 london 12
1 newyork 15
2 paris 22
2 london 15
2 newyork 14
لكل item_id، أريد أن أعرف أرخص مكان للحصول عليه، والسعر الذي سأدفعه في هذا المكان. للمثال أعلاه، أود أن أرى الإخراج التالي:
item_id source price
------- ------- ---------
1 london 12
2 newyork 14
هل هناك طريقة بسيطة للقيام بذلك دون ذكر اسم الجدول مرتين؟ أنا أستخدم MySQL، لذلك لا يمكنني استخدام جملة مع.
لقد ألقيت نظرة على حل الاستعلام الذي انضم في سؤال مستخدم آخر (سجلات المجموعة ذات الصلة، ولكن اختر حقول معينة من السجل الأول فقط)، ولكن أود حقا تجنب ذكر الطاولة مرتين. المشكلة هي أن الجدول البسيط في هذا السؤال يمثل بالفعل عرضا مضمنا في مشكلتي الحقيقية التي تستغرق حوالي 5 ثوان لإنشاء لكل استخدام، لذلك آمل أن أجد بدائل.
المحلول
إليك طريقة واحدة، باستخدام انضمام داخلي إلى تصفية الصفوف بأقل سعر:
select i.*
from items i
inner join (
select item_id, min(price) as minprice
from items
group by item_id
) cheapest on i.price = cheapest.minprice
and i.item_id = cheapest.item_id
إذا كانت هناك مصادر متعددة بأقل سعر، فسيتم إظهارها جميعا.
تحرير: نظرا لأن سؤالك يذكر أن طريقة عرض العناصر تستغرق وقتا طويلا للبناء، يمكنك تخزين النتيجة في جدول مؤقت.
create temporary table temp_items
as
select item_id, source, price from YourView
ثم قم بتشغيل استعلام Grouping على الجدول المؤقت. في MySQL، يكون جدول مؤقت مرئي فقط للاتصال الحالي، ويتم إسقاطه تلقائيا عند إغلاق الاتصال.
نصائح أخرى
أنا لسوء الحظ لا أعرف بيانات mysql وتحويل السلسلة عن ظهر قلب. ولكن هنا شيء إذا قمت بتدليك ذلك قليلا بالنسبة للبناء الصحيح قد يفاجئك:
SELECT
item_id,
source = Convert(varchar(30), Substring(packed, 5, 30)),
price = Convert(int, Substring(packed, 1, 4))
FROM
(
SELECT
item_id,
Min(Convert(binary(4), price) + Convert(varbinary(30), source) AS packed
FROM items
GROUP BY item_id
) X
هذا بالتأكيد اختراق. بالتأكيد لا ينبغي أن تستخدم في جميع الحالات. ولكن عندما يكون الأداء أمرا بالغ الأهمية، في بعض الأحيان يستحق كل هذا العناء.
يرى هذا الموضوع لمزيد من المعلومات.