استعلام MySQL معقدة لقائمة انتظار النشرات الإخبارية

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

سؤال

يا الجميع، أنا أعود وأتطلع إلى المزيد من تألقك. انا لدي طاولتان:

  1. النشرات الإخبارية - يحتوي كل صف على "معرف"، "موضوع"، "هيئة" & "من رؤوس بريد إلكتروني
  2. newsnetter_queue - يحتوي كل صف على عنوان "معرف"، "تاريخ البريد الإلكتروني"، تمت إضافة "تاريخ" إلى قائمة الانتظار و "NewsNameTerid"

هدفي هو تطوير استعلام MySQL الذي يمكنه سحب كمية X من الصفوف من "NewsNetter_Queue"، ثم قم بتجميعها بواسطة "NewsLetterID" أثناء استخدام Group_Concat (أو أي Works) لوضع جميع رسائل البريد الإلكتروني في سلسلة منفصلة حرفا والتي سوف تحللها مع php. السبب في أنني أرغب في الحصول عليها معا هو أن مكتبة البريد الإلكتروني التي أستخدمها (Swiftmailer) تقبل صفيفا مع رسائل البريد الإلكتروني لرسائل البريد الإلكتروني الدفعية. أيضا، إذا كان ذلك ممكنا، فسيكون ذلك أنيقا للغاية للانضمام إلى الجداولتين معا، مما يتجنب استعلام ثان.

إليك ما لدي حتى الآن:

SELECT GROUP_CONCAT(email ORDER BY date ASC SEPARATOR '|'), newsletterid, date
FROM newsletter_queue
WHERE status='0'
GROUP BY newsletterid
LIMIT 125

مشكلتي هي أن الحد الأقصى 125 يتم تطبيقه على الصفوف المتسلسلة بالفعل، مما يجعله عديم الفائدة بسبب حقيقة أنني أحاول الحد من كمية إجمالي رسائل البريد الإلكتروني التي يتم إرسالها في وقت واحد، وليس النشرات الإخبارية الفريدة. إذا كان أي شخص يمكن أن يرشدني في الاتجاه الصحيح، سأكون ممتنا للغاية. إذا كنت تنتهي بكتابة المثال، فهذا رائع أيضا.

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

المحلول

SELECT GROUP_CONCAT(email ORDER BY date ASC SEPARATOR '|'), newsletterid, date
FROM 
   (SELECT email, newsletterid, date 
    FROM newsletter_queue
    WHERE status="0"
    ORDER BY date ASC
    LIMIT 125) as Unsent
GROUP BY newsletterid

ينطبق هذا الحد الأقصى على الاستعلام الداخلي، قبل تنفيذ المجموعة حسب العبارة. لا يهم أن المجموعة حسب العبارة في الاستعلام الخارجي منذ أن تحتاج المجموعة إلى طاولة مؤقتة وفرز على أي حال. إذا كنت بحاجة إلى نوع من طلب النتيجة المتسلسلة، فيمكنك فقط تطبيقه على الاستعلام الخارجي، على سبيل المثال عن طريق تطبيق MAX أو MIN حتى الآن.

نصائح أخرى

هذا يجب أن يفعل أيضا ما تريد:

SELECT substring_index(GROUP_CONCAT(email ORDER BY date ASC SEPARATOR '|'),'|',125), newsletterid, date
FROM newsletter_queue
WHERE status='0'
GROUP BY newsletterid

الفكرة البرية ولكن هل هذا العمل؟

SELECT GROUP_CONCAT(email ORDER BY date ASC SEPARATOR '|'), newsletterid, date
FROM newsletter_queue
WHERE status='0'
GROUP BY newsletterid, ID MOD 125

كنت أظن أن أقصى قدر من إلكترونيات البريد الإلكتروني في سجل واحد ليكون 125.
لسوء الحظ، فإن المبلغ ليس دقيقا 125. يمكن أن يكون بين 1 و 125.

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