وظائف إجمالية - الحصول على الأعمدة غير المدرجة في جملة المجموعة

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

سؤال

لدي جدول لديه ثلاثة حقول (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

هذا بالتأكيد اختراق. بالتأكيد لا ينبغي أن تستخدم في جميع الحالات. ولكن عندما يكون الأداء أمرا بالغ الأهمية، في بعض الأحيان يستحق كل هذا العناء.

يرى هذا الموضوع لمزيد من المعلومات.

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