2011-06-28 4 views
2

私はmysqlのfollow文を使ってmysqlからphp経由で情報を取得しています。この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']どのように私はこのmysqlの文を簡素化することができ

..... 23,31,653,147,146,134,6が好きQIDのセットですか?

+3

あなたのテーブル構造を確認できますか? –

+1

SQLをコードとしてフォーマットしてください。 –

+2

なぜそれを簡素化する必要がありますか?パフォーマンス?コードの明快さ? – CanSpice

答えて

1

ユーザー変数を使用して、グループ単位で合計を実行し続けることができます。これはテストされていませんが、次のようなものは動作するはずです:あなたが好きなように...その方法は、あなただけで簡単にMOD、など多くのレベルのためにこれを拡張することができ

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

関連する問題