كيف أقوم بتسلسل مجموعات النتائج بأكملها في MySQL؟

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

  •  08-06-2019
  •  | 
  •  

سؤال

أحاول إجراء الاستعلام التالي:

SELECT A,B,C FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY B ASC LIMIT 5

هذه ثلاثة استفسارات عالقة معًا، نوعًا ما.ومع ذلك، فإن مجموعة النتائج التي تعود تعكس نتائج الاستعلام رقم 3 قبل نتائج الاستعلام رقم 1 وهو أمر غير مرغوب فيه.

هل هناك أي طريقة لتحديد أولويات هذه النتائج بحيث تأتي النتائج كلها للاستعلام رقم 1، ثم الكل للاستعلام رقم 2 ثم الكل للاستعلام رقم 3؟لا أريد القيام بذلك في PHP حتى الآن (ناهيك عن الاضطرار إلى التحكم في النتائج التي تظهر في الاستعلام الأول حتى لا تظهر في الاستعلام الثاني وما إلى ذلك).

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

المحلول

ربما يجب عليك محاولة تضمين عمود رابع، مع ذكر الجدول الذي جاء منه، ثم ترتيبه وتجميعه حسبه:

SELECT A,B,C, "query 1" as origin FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C, "query 2" as origin FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C, "query 3" as origin FROM table WHERE field LIKE '%query%'
GROUP BY origin, B ORDER BY origin, B ASC LIMIT 5

نصائح أخرى

أضف عمودًا إضافيًا يحتوي على قيم مشفرة ستستخدمها لفرز مجموعة النتائج الإجمالية، كما يلي:

SELECT A,B,C,1 as [order] FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C,2 as [order] FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C,3 as [order] FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY [order] ASC, B ASC LIMIT 5

هل يمكنك القيام بذلك كتحديد فرعي، شيء من هذا القبيل

SELECT * FROM (
    SELECT A,B,C FROM table WHERE field LIKE 'query%'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query%'
) ORDER BY B ASC LIMIT 5

حدد متميزًا A ، B ، C من (SELECT A ، B ، C ، 1 AS O من الجدول حيث مثل حقل مثل "Query ٪" Union Select A ، B ، C ، 2 As O من الجدول حيث مثل "Query Query". A ، B ، C ، 3 كـ O من الجدول حيث يكون الحقل مثل "٪ Query ٪") بواسطة O ASC LIME 5

ستكون طريقتي للقيام بذلك.أنا لا أعرف كيف المقاييس.

أنا لا أفهم

GROUP BY B ORDER BY B ASC LIMIT 5

هل ينطبق فقط على التحديد الأخير في الاتحاد؟

هل يسمح لك mysql بالفعل بالتجميع حسب عمود ولا يزال لا يقوم بالتجميع على الأعمدة الأخرى؟

يحرر:آآآه.أرى أن الخلية تفعل ذلك بالفعل.إنها نسخة خاصة من DISTINCT(b) أو شيء من هذا القبيل.لا أريد أن أحاول أن أكون خبيرًا في هذا المجال :)

إذا لم يكن هناك نوع منطقي لترتيبها حسب رغبتك، فلا تجمع النتائج معًا - ما عليك سوى إرجاع 3 مجموعات سجلات منفصلة والتعامل معها وفقًا لذلك في طبقة البيانات الخاصة بك.

لقد توصلت في النهاية (بالنظر إلى جميع الاقتراحات) إلى هذا الحل، فهو عبارة عن حل وسط بين ما أحتاج إليه والوقت.

SELECT * FROM 
  (SELECT A, B, C, "1" FROM table WHERE B LIKE 'query%' LIMIT 3
   UNION
   SELECT A, B, C, "2" FROM table WHERE B LIKE '%query%' LIMIT 5)
AS RS
GROUP BY B
ORDER BY 1 DESC

يقدم إجمالي 5 نتائج، ويفرز من "العمود" الرابع ويعطيني ما أحتاج إليه؛مجموعة نتائج طبيعية (تأتي عبر AJAX)، ومجموعة نتائج أحرف البدل التالية مباشرة بعد ذلك.

:)

/ النائب

هناك نوعان مختلفان من UNION.

'UNION' and 'UNION ALL'

في معظم الحالات، ما تريد قوله حقًا هو UNION ALL لأنه لا يقوم بإزالة التكرارات (Think SELECT DISTINCT) بين المجموعات مما قد يؤدي إلى توفير قدر كبير من التوفير من حيث وقت التنفيذ.

اقترح آخرون مجموعات نتائج متعددة وهو حل عملي ولكني أود أن أحذر من هذا في التطبيقات الحساسة للوقت أو التطبيقات المتصلة عبر شبكات WAN لأن القيام بذلك قد يؤدي إلى المزيد من الرحلات ذهابًا وإيابًا بشكل ملحوظ على السلك بين الخادم والعميل.

لا أفهم سبب الحاجة إلى الاتحاد لأخذ البيانات من جدول واحد SELECT A ,B ,C FROM table WHERE field LIKE 'query%' or field LIKE '%query' or field LIKE '%query%' GROUP BY B ORDER BY B ASC LIMIT 5

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