1
SELECT *, COUNT(*) AS conteggio FROM (
(SELECT uno, ruota, data FROM table WHERE ruota = 'BA'  
           ORDER BY data DESC LIMIT 540)
 UNION ALL
 (SELECT due, ruota, data FROM table WHERE ruota = 'BA'  
           ORDER BY data DESC LIMIT 540)
 UNION ALL
(SELECT tre, ruota, data FROM table WHERE ruota = 'BA'  
           ORDER BY data DESC LIMIT 540)
 UNION ALL
 (SELECT quattro, ruota, data FROM table WHERE ruota = 'BA'  
           ORDER BY data DESC LIMIT 540)
 UNION ALL
(SELECT cinque, ruota, data FROM table WHERE ruota = 'BA'  
           ORDER BY data DESC LIMIT 540)
) t
GROUP BY uno
ORDER BY conteggio DESC LIMIT 20
-------------------------------------------------
SELECT *, COUNT(*) AS conteggio FROM (
(SELECT uno, ruota, data FROM table WHERE ruota = 'CA'  
           ORDER BY data DESC LIMIT 540)
 UNION ALL
 (SELECT due, ruota, data FROM table WHERE ruota = 'CA'  
           ORDER BY data DESC LIMIT 540)
 UNION ALL
(SELECT tre, ruota, data FROM table WHERE ruota = 'CA'  
           ORDER BY data DESC LIMIT 540)
 UNION ALL
 (SELECT quattro, ruota, data FROM table WHERE ruota = 'CA'  
           ORDER BY data DESC LIMIT 540)
 UNION ALL
(SELECT cinque, ruota, data FROM table WHERE ruota = 'CA'  
           ORDER BY data DESC LIMIT 540)
) t
GROUP BY uno
ORDER BY conteggio DESC LIMIT 20

上記の 2 つのクエリの代わりに 1 つのクエリのみを使用する方法はありますか?
唯一の違いはWHERE ruota = 'VARIABLE'

4

3 に答える 3

3

あなたが書くとき

WHERE ruota = 'CA' ORDER BY data DESC LIMIT 540

あなたは「カリアリからの最後の540の抽出物をちょうだい」と尋ねています。これらをBariのものと追加すると、1080行になります。

聞いてみましたか

WHERE ruota IN ('CA','BA') ORDER BY data DESC LIMIT 540

540行しか取得できないため、最初に制限を1080に上げる必要があります

これで、アーカイブは完成しましたか?そうでない場合、または2つのホイールからの抽出数が異なる場合、(CA + BA)で得られる1080行は、(CA)+(BA)で得られるものと同じではありません。

また、グループ化の抽出日は必要ありません。したがって、次のクエリを実行できます。

SELECT ruota, numero, COUNT(*) AS conteggio FROM (
    (SELECT uno AS numero, ruota FROM estrazioni WHERE ruota IN ('CA','BA')
         ORDER BY data DESC LIMIT 1080)
UNION ALL
    (SELECT due AS numero, ruota FROM estrazioni WHERE ruota IN ('CA','BA')
         ORDER BY data DESC LIMIT 1080)
... ) AS preliminare
GROUP BY ruota, numero;

数の頻度だけに関心がある場合は、ホイールは必要ありません。

SELECT numero, COUNT(*) AS conteggio FROM (
    (SELECT uno AS numero FROM estrazioni WHERE ruota IN ('CA','BA')
         ORDER BY data DESC LIMIT 1080)
UNION ALL
    (SELECT due AS numero FROM estrazioni WHERE ruota IN ('CA','BA')
         ORDER BY data DESC LIMIT 1080)
... ) AS preliminare
GROUP BY numero;

そして最後に、副選択でグループ化し、部分的なカウントを合計することで実験することができます。

SELECT ruota, numero, SUM(conteggio) AS conteggio FROM (
    SELECT ruota, numero, count(numero) AS conteggio FROM (
        SELECT ruota, uno AS numero FROM estrazioni WHERE ruota IN ('CA','BA')
            ORDER BY data DESC LIMIT 1080 ) AS primo GROUP BY ruota, numero
    UNION ALL SELECT ruota, numero, count(numero) AS conteggio FROM (
        SELECT ruota, due AS numero FROM estrazioni WHERE ruota IN ('CA','BA')
            ORDER BY data DESC LIMIT 1080 ) AS secondo GROUP BY ruota, numero
    UNION ALL SELECT ruota, numero, count(numero) AS conteggio FROM (
        SELECT ruota, tre AS numero FROM estrazioni WHERE ruota IN ('CA','BA')
            ORDER BY data DESC LIMIT 1080 ) AS terzo GROUP BY ruota, numero
    UNION ALL SELECT ruota, numero, count(numero) AS conteggio FROM (
        SELECT ruota, quattro AS numero FROM estrazioni WHERE ruota IN ('CA','BA')
            ORDER BY data DESC LIMIT 1080 ) AS quarto GROUP BY ruota, numero
    UNION ALL SELECT ruota, numero, count(numero) AS conteggio FROM (
        SELECT ruota, cinque AS numero FROM estrazioni WHERE ruota IN ('CA','BA')
            ORDER BY data DESC LIMIT 1080 ) AS quinto GROUP BY ruota, numero
) AS preliminare GROUP BY ruota, numero ORDER BY conteggio DESC LIMIT 20;

この最後のバージョンは、5つの1080行の副選択で発生を合計し、5行の選択からそれらを合計します。5400行を1回グループ化するのではなく、1080を5回グループ化します。使用するメモリを少なくする必要があります。それが速いかどうかはわかりません。

更新:SQLを修正し、最後のクエリを検証しました。

于 2012-08-29T10:37:13.600 に答える
3
  1. データを正規化します。

    CREATE TABLE newtable (
      col INT,
      INDEX (ruota, val),
      FOREIGN KEY(ruota, data) REFERENCES `table` (ruota, data)
    ) SELECT 1, uno val, ruota, data FROM `table` UNION ALL
      SELECT 2, due,     ruota, data FROM `table` UNION ALL
      SELECT 3, tre,     ruota, data FROM `table` UNION ALL
      SELECT 4, quattro, ruota, data FROM `table` UNION ALL
      SELECT 5, cinque,  ruota, data FROM `table`;
    
    ALTER TABLE `table`
      DROP COLUMN uno,
      DROP COLUMN due,
      DROP COLUMN tre,
      DROP COLUMN quattro,
      DROP COLUMN cinque;
    
  2. 既存のクエリを簡素化します。

    SELECT   val, ruota, LEAST(COUNT(*), 540) conteggio
    FROM     newtable
    WHERE    ruota = ?
    GROUP BY val
    ORDER BY conteggio DESC
    LIMIT    20;
    
  3. クエリを結合します。

    SELECT   val, ruota, LEAST(COUNT(*), 540) conteggio
    FROM     newtable
    WHERE    ruota IN ('BA', 'CA')
    GROUP BY ruota, val
    ORDER BY conteggio DESC
    LIMIT    20;
    
于 2012-08-29T10:33:38.263 に答える
0

完全な SQL スクリプトをもう一度繰り返す代わりに、INSQL の for 句に移動し、両方の変数をコンマ区切り値として指定し、同じクエリで結果を選択することができます。何かのようなもの

WHERE ruota IN ('CA' ,'BA')
于 2012-08-29T10:15:24.723 に答える