2011-06-28 86 views
2

我使用遵循mysql语句通过php从mysql获取一些信息。我怎样才能简化这个mysql语句?

(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这个说法?

+3

我们可以看看您的表格结构吗? –

+1

请将SQL格式化为代码。 –

+2

为什么你需要简化它?性能?代码清晰? – CanSpice

回答

1

您可以使用用户变量来按组保持总计运行。这是未经测试,但像下面应该工作:

select *, 
     @running:[email protected]:=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

谢谢您的回答! _ ^。 – yoohoow

0

动态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; 
+0

感谢您的回答!^ _ ^。 – yoohoow