سؤال

Product الجدول:

id: int
name: varchar(255)
info: varchar(8000)

ولست بحاجة للحصول على قائمة بجميع المنتجات ، مجمعة حسب الاسم ، وإذا كان بعض المنتجات لها نفس الاسم ثم واحد مع معظم البيانات في info يجب اختيار الحقل للعرض.مطلب آخر هو الاتساق - يجب ضمان عرض نفس المنتجات في كل مرة.لكن الأداء ليس قلقي على الإطلاق مع هذا.

لذا فإن أفضل ما توصلت إليه حتى الآن هو هذا:

select * from (select * from product order by length(info) desc) as product group by name

أفهم أن هذا ينبغي العمل في الخلية ولكن لا يضمن النتائج.

هل هناك أي طريقة أفضل?

تحديث:

مثال على ما أبحث عنه.إذا كانت البيانات

1, 'Product1', '12345'
2, 'Product1', '123'
3, 'Product2', '123456'
4, 'Product2', '123456'
5, 'Product2', '12'

يجب أن تكون النتائج المتوقعة إما:

1, 'Product1', '12345'
3, 'Product2', '123456'

أو

1, 'Product1', '12345'
4, 'Product2', '123456'

لا يهمني أي واحد من الاثنين طالما أنها نفس النتيجة في كل مرة أقوم بتشغيل الاستعلام.

هل كانت مفيدة؟

المحلول

أعتقد أنك بحاجة إلى الانضمام:

select p.*
from product p join
     (select p.name, max(len(info)) as maxinfolen
      from product p
      group by p.name
     ) t
     on p.name = t.name and
        len(p.info) = t.maxinfolen

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

select p.name, max(info)
from product p join
     (select p.name, max(len(info)) as maxinfolen
      from product p
      group by p.name
     ) t
     on p.name = t.name and
        len(p.info) = t.maxinfolen
group by p.name

إذا كنت تحاول اختيار نفس المعرف في كل مرة ، فيمكنك استخدام نفس الفكرة:

select p.*
from product p join
     (select p.name, min(id) as minid
      from product p join
           (select p.name, max(len(info)) as maxinfolen
            from product p
            group by p.name
           ) t
           on p.name = t.name and
              len(p.info) = t.maxinfolen
      group by p.name
     ) t
     on p.name = t.name and
        p.id = t.minid
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top