Как я мог упростить это утверждение MySQL? - PullRequest
2 голосов
/ 28 июня 2011

Я использую следующий оператор mysql, чтобы получить некоторую информацию из mysql через php.

( SELECT * 
    FROM mytable 
   WHERE qid NOT IN ({$used['used']}) 
     AND level = 1 
ORDER BY RAND() 
   LIMIT 5) 
UNION 
( SELECT * 
    FROM app_mytable _qt 
   WHERE qid NOT IN ({$used['used']}) 
     AND level = 2 
ORDER BY RAND() 
   LIMIT 5) 
UNION 
( SELECT * 
    FROM app_mytable _qt 
   WHERE qid NOT IN ({$used['used']}) 
     AND level = 3 
ORDER BY RAND() 
   LIMIT 5) 
UNION 
( SELECT * 
    FROM app_mytable _qt 
   WHERE qid NOT IN ({$used['used']}) 
     AND level = 4 
ORDER BY RAND() 
   LIMIT 5)

$used['used'] - это набор qid, которым нравится 23,31,653,147,146,134,6 .....

Как я мог упростить это утверждение MySQL?

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Вы можете использовать пользовательские переменные для продолжения подсчета итогов по группам.Это не проверено, но должно работать что-то вроде следующего:

select *, 
       @running:=@previous:=NULL
  from (
         select *,
                @running:=if(@previous=inside.level,@running,0)+1 as TOTAL,
                @previous:=inside.level
           from (
                  select * 
                    from mytable
                   where qid NOT IN ({$used['used']})
                   order by level, rand() 
                ) as inside
       )as outside
 where TOTAL < 5;
0 голосов
/ 28 июня 2011

Некоторые динамические sql могут исключить вставку копий для вас ... таким образом, вы можете легко расширить это на любое количество уровней, просто изменив max_level.

DECLARE current_level INT;  SET current_level = 1;
DECLARE max_level INT; SET max_level = 4;
DECLARE full_sql VARCHAR(1000); SET full_sql = '';
DECLARE base_sql VARCHAR(1000); SET base_sql = '(SELECT * FROM mytable WHERE qid NOT IN ({$used['used']}) AND level = ? ORDER BY RAND() limit 5) ';

WHILE current_level <= max_level
    SET full_sql = CONCAT(full_sql, REPLACE(base_sql, '?', current_level));

    IF current_level < max_level THEN
      SET full_sql = CONCAT(full_sql, ' UNION ');
    END IF
    SET current_level = current_level + 1;
END WHILE

PREPARE s1 FROM full_sql;
EXECUTE s1;
DEALLOCATE PREPARE s1; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...