Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MYSQL प्रत्येक श्रेणी से 2 यादृच्छिक पंक्तियों का चयन करता है

जैसा कि आपने वर्णन किया है, बस प्रति श्रेणी 2 प्राप्त करें, और अंत में एक यादृच्छिक। यह एक प्रश्न नहीं है, बल्कि एक परिणाम-सेट है, जिसकी आपको आवश्यकता हो सकती है:

SELECT * FROM (SELECT * FROM questions WHERE category= 1 ORDER BY rand() limit 0,2) as t1
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 2 ORDER BY rand() limit 0,2) as t2
UNION 
SELECT * FROM (SELECT * FROM questions WHERE category= 3 ORDER BY rand() limit 0,2) as t3
UNION
...

(नेस्टेड चयन आपको प्रति श्रेणी रैंड() के अनुसार क्रमबद्ध करने की अनुमति देता है) अब तक कुछ खास नहीं - प्रति श्रेणी 2 यादृच्छिक प्रश्न।

अब मुश्किल हिस्सा 15वां तत्व जोड़ना है बिना उनमें से किसी का चयन करना जो आपके पास पहले से है।

इसे "एक" कॉल के साथ प्राप्त करने के लिए, आप निम्न कार्य कर सकते हैं:

  • उपरोक्त की तरह आपके द्वारा चुने गए 14 प्रश्नों का सबसेट लें।
  • डेटाबेस से यादृच्छिक क्रमबद्ध चीजों के एक अवर्गीकृत सेट के साथ इसे संघ। (सीमा 0,15)
  • इस परिणाम से सभी का चयन करें, 0,15 को सीमित करें।

  • यदि LAST सबक्वेरी के पहले 14 तत्व पहले से ही चुने गए हैं - तो उन्हें UNION के कारण हटा दिया जाएगा। , और एक स्वतंत्र 15वें तत्व की गारंटी है।

  • यदि अंतिम आंतरिक क्वेरी में भी 15 अलग-अलग प्रश्नों का चयन किया जाता है, तो बाहरी सीमा 0,15 केवल उनमें से पहले को ही परिणाम में ले जाएगी।

कुछ इस तरह:

SELECT * FROM (
    SELECT * FROM (SELECT * FROM questions WHERE category= 1 ORDER BY rand() limit 0,2) as t1
    UNION
    SELECT * FROM (SELECT * FROM questions WHERE category= 2 ORDER BY rand() limit 0,2) as t2
    UNION 
    SELECT * FROM (SELECT * FROM questions WHERE category= 3 ORDER BY rand() limit 0,2) as t3
    UNION
    ...
    UNION
    SELECT * FROM (SELECT * FROM questions ORDER BY rand() LIMIT 0,15) as t8
) AS tx LIMIT 0,15

यह कुछ हद तक बदसूरत है, लेकिन आपको वही करना चाहिए जो आपको चाहिए:प्रत्येक श्रेणी से 2 यादृच्छिक प्रश्न, और अंत में एक यादृच्छिक प्रश्न जिसे पहले से ही किसी भी श्रेणी से नहीं चुना गया है। किसी भी समय कुल 15 प्रश्न।

(सिडनोड:आप NOT IN () . का उपयोग करके दूसरी क्वेरी भी चला सकते हैं 7 श्रेणियों के लिए 14 प्रश्नों को निर्धारित करने के बाद पहले से चयनित प्रश्नों को अस्वीकार करने के लिए।)

संपादित करें:दुर्भाग्य से SQL Fiddle इस समय काम नहीं कर रहा है। यहां कुछ फिडल कोड दिया गया है:

CREATE TABLE questions (id int(10), category int(10), question varchar(20));

INSERT INTO questions (id, category, question)VALUES(1,1,"Q1");
INSERT INTO questions (id, category, question)VALUES(2,1,"Q2");
INSERT INTO questions (id, category, question)VALUES(3,1,"Q3");
INSERT INTO questions (id, category, question)VALUES(4,2,"Q4");
INSERT INTO questions (id, category, question)VALUES(5,2,"Q5");
INSERT INTO questions (id, category, question)VALUES(6,2,"Q6");
INSERT INTO questions (id, category, question)VALUES(7,3,"Q7");
INSERT INTO questions (id, category, question)VALUES(8,3,"Q8");
INSERT INTO questions (id, category, question)VALUES(9,3,"Q9");
INSERT INTO questions (id, category, question)VALUES(10,4,"Q10");
INSERT INTO questions (id, category, question)VALUES(11,4,"Q11");
INSERT INTO questions (id, category, question)VALUES(12,4,"Q12");
INSERT INTO questions (id, category, question)VALUES(13,5,"Q13");
INSERT INTO questions (id, category, question)VALUES(14,5,"Q14");
INSERT INTO questions (id, category, question)VALUES(15,5,"Q15");
INSERT INTO questions (id, category, question)VALUES(16,6,"Q16");
INSERT INTO questions (id, category, question)VALUES(17,6,"Q17");
INSERT INTO questions (id, category, question)VALUES(18,6,"Q18");
INSERT INTO questions (id, category, question)VALUES(19,7,"Q19");
INSERT INTO questions (id, category, question)VALUES(20,7,"Q20");
INSERT INTO questions (id, category, question)VALUES(21,7,"Q21");

प्रश्न

SELECT * FROM (
    SELECT * FROM (SELECT * FROM questions WHERE category= 1 ORDER BY rand() limit 0,2) as t1
    UNION 
    SELECT * FROM (SELECT * FROM questions WHERE category= 2 ORDER BY rand() limit 0,2) as t2
    UNION 
    SELECT * FROM (SELECT * FROM questions WHERE category= 3 ORDER BY rand() limit 0,2) as t3
    UNION 
    SELECT * FROM (SELECT * FROM questions WHERE category= 4 ORDER BY rand() limit 0,2) as t4
    UNION 
    SELECT * FROM (SELECT * FROM questions WHERE category= 5 ORDER BY rand() limit 0,2) as t5
    UNION 
    SELECT * FROM (SELECT * FROM questions WHERE category= 6 ORDER BY rand() limit 0,2) as t6
    UNION 
    SELECT * FROM (SELECT * FROM questions WHERE category= 7 ORDER BY rand() limit 0,2) as t7
    UNION 
    SELECT * FROM (SELECT * FROM questions ORDER BY rand() LIMIT 0,15) as t8
) AS tx LIMIT 0,15

उदाहरण डेटा में प्रति प्रकार 3 प्रश्न होते हैं, जिसके परिणामस्वरूप 15वां प्रश्न (अंतिम पंक्ति) हमेशा एक श्रेणी से शेष होता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. रीफ्रेश करने के बाद भी टेक्स्टबॉक्स मान बनाए रखना

  2. मैं php और mysql के साथ sql इंजेक्शन को कैसे रोकूं?

  3. आप MySQL क्लाइंट के लिए डिफ़ॉल्ट पेजर कैसे सेट करते हैं?

  4. डुप्लीकेट कुंजी अद्यतन पर MYSQL अद्यतन नहीं हुआ

  5. ज़ेंड डीबी / माइस्क्ल - चयन के साथ डालें