سؤال

النظر في هذا الجدول (من http://www.tizag.com/mysqltutorial/mysqlmax.php):

Id     name               type     price 
123451 Park's Great Hits  Music    19.99 
123452 Silly Puddy        Toy      3.99 
123453 Playstation        Toy      89.95 
123454 Men's T-Shirt      Clothing 32.50 
123455 Blouse             Clothing 34.97 
123456 Electronica 2002   Music    3.99 
123457 Country Tunes      Music    21.55 
123458 Watermelon         Food     8.73

يعيد استعلام SQL هذا أغلى عنصر من كل نوع: حدد النوع ، Max (السعر) من مجموعة المنتجات حسب النوع

Clothing $34.97
Food     $8.73
Music    $21.55
Toy      $89.95

أريد أيضًا الحصول على الحقول هوية شخصية و اسم التي تنتمي إلى سعر الحد الأقصى أعلاه ، لكل صف. ما هو استعلام SQL سيعيد جدولًا كهذه؟

Id     name            type      price
123455 Blouse          Clothing  34.97
123458 Watermelon      Food      8.73
123457 Country Tunes   Music     21.55
123453 Playstation     Toy       89.95
هل كانت مفيدة؟

المحلول

هذا ال greatest-n-per-group المشكلة التي تظهر بشكل متكرر. إن طريقتي المعتادة لحلها تعادل منطقيا الإجابة التي قدمها Martin Smith ، لكنها لا تستخدم مساعًا فرعيًا:

SELECT T1.Id, T1.name, T1.type, T1.price 
FROM Table T1
LEFT OUTER JOIN Table T2
  ON (T1.type = T2.type AND T1.price < T2.price)
WHERE T2.price IS NULL;

إن حلي وجميع الآخرين المقدمين في هذا الموضوع حتى الآن لديهم فرصة لإنتاج صفوف متعددة لكل قيمة type, ، إذا كان أكثر من منتج يشارك نفس النوع ولديه سعر متساوٍ هو الحد الأقصى. هناك طرق لحل هذا وكسر التعادل ، ولكن عليك أن تخبرنا بالمنتج "يفوز" في حالة كهذا.

تحتاج إلى بعض السمات الأخرى التي تضمن أن تكون فريدة من نوعها على جميع الصفوف ، على الأقل بالنسبة للصفوف مع نفس type. على سبيل المثال ، إذا كان المنتج مع أكبر Id يجب أن تفوز القيمة ، يمكنك حل التعادل بهذه الطريقة:

SELECT T1.Id, T1.name, T1.type, T1.price 
FROM Table T1
LEFT OUTER JOIN Table T2
  ON (T1.type = T2.type AND (T1.price < T2.price
       OR T1.price = T2.price AND T1.Id < T2.Id))
WHERE T2.price IS NULL;

نصائح أخرى

يحرر مجرد تحديث الألغام لتلبية المتطلبات الموضحة

SELECT Id, name, type,price 
FROM Table T1
WHERE NOT EXISTS(
          SELECT * FROM TABLE T2 
          WHERE T1.type=t2.type 
          AND T2.Price >= T1.Price 
          AND T2.Id > T1.Id
          )

يمكنك القيام بذلك مع مجموعة فرعية

SELECT id, name, type, price FROM products p1
WHERE EXISTS (Select type, max(price) FROM Products p2 
              GROUP BY type
              WHERE p1.type=p2.type AND p1.price=p2.MAX(price))

أو انضمام داخلي

SELECT id, name, type, price FROM products p1
INNER JOIN (Select type, max(price) FROM Products p2 GROUP BY type) maxPrice
         ON maxPrice=price=p1.price AND maxPrice.type=p1.price
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top