-2

私はSQLの初心者なので、心配しないでください:)

辞書の単語の翻訳を保存するテーブルがあります。この表にはidla(言語)、lb(ターゲット言語)、wa(元の単語)、wb(翻訳された単語)、およびいくつかの重要でない列があります:)。テーブルの概要を表示したいと思います。ここには、各言語の単語数を含むすべての言語のリストと、合計単語数 (異なる単語のみのすべてのカウント) を含む言語としての SUM の行があります。

私はこのクエリを書きました:

SELECT `lng`, COUNT(`word`) AS `count` 
FROM (
  SELECT DISTINCT * 
  FROM (
     SELECT DISTINCT `la` AS `lng`, `wa` AS `word` 
     FROM `dict_trans` 
     UNION ALL 
     SELECT DISTINCT `lb` AS `lng`, `wb` AS `word` 
     FROM `dict_trans`
  ) AS `tbla`
) AS `tblb` GROUP BY `lng`
UNION ALL
SELECT 'sum' AS `lng`, COUNT(`word`) AS `count` 
FROM (
  SELECT DISTINCT * 
  FROM (
    SELECT DISTINCT `la` AS `lng`, `wa` AS `word` 
    FROM `dict_trans` 
    UNION ALL 
    SELECT DISTINCT `lb` AS `lng`, `wb` AS `word` 
    FROM `dict_trans`
  ) AS `tblc`
) AS `tbld` ORDER BY `count` DESC

しかし、サブクエリをもう1つ実行するのは非常にばかげており、パフォーマンスに優しくないと思います。

SELECT DISTINCT * 
FROM (
  SELECT DISTINCT `la` AS `lng`, `wa` AS `word` 
  FROM `dict_trans` 
  UNION ALL 
  SELECT DISTINCT `lb` AS `lng`, `wb` AS `word` 
  FROM `dict_trans`
) AS `tbla`

コードの2番目の部分で、最初の部分からテーブルへの参照を渡すことを試みました:

SELECT `lng`, COUNT(`word`) AS `count` 
FROM (
  SELECT DISTINCT * 
  FROM (
     SELECT DISTINCT `la` AS `lng`, `wa` AS `word` 
     FROM `dict_trans` 
     UNION ALL 
     SELECT DISTINCT `lb` AS `lng`, `wb` AS `word` 
     FROM `dict_trans`
   ) AS `tbla`
) AS `tblb` GROUP BY `lng`
UNION ALL
SELECT 'sum' AS `lng`, COUNT(`word`) AS `count` 
FROM `tblb` 
ORDER BY `count` DESC

しかし、エラーがスローされました (#1146 - テーブル 'db.tblb' が存在しません)。

一時テーブルを作成せずにこの問題を解決することは可能ですか?

4

1 に答える 1

1

クエリのすべての複雑さは必要ありません。UNIONつまりUNION DISTINCT、3 レベルのネストは必要なく、追加のカウントはWITH ROLLUP修飾子で行うことができます。

SELECT lng AS language, 
       COUNT(word) AS WordCount 
FROM
  ( SELECT la AS lng, wa AS word 
    FROM dict_trans 
  UNION                                 -- DISTINCT is the default
    SELECT lb, wb 
    FROM dict_trans
  ) AS t
GROUP BY lng
  WITH ROLLUP ;

並べ替えが必要な場合は、別のネストが必要になります。

SELECT language, WordCount 
FROM
  ( SELECT COALESCE(lng, 'Total') AS language, 
           COUNT(word) AS WordCount 
    FROM
      ( SELECT la AS lng, wa AS word 
        FROM dict_trans 
      UNION                                 -- DISTINCT is the default
        SELECT lb, wb 
        FROM dict_trans
      ) AS t
    GROUP BY lng
      WITH ROLLUP 
  ) AS tmp
ORDER BY CASE WHEN language = 'Total' THEN 1 ELSE 0 END,
         WordCount DESC ;

このクエリの最も高価な部分は、UNION(必要なためDISTINCT) とGROUP BY操作です。効率が必要な場合は、すべての異なる言語と単語の組み合わせを含む別のテーブルを用意し、そのテーブルでグループ化する方がはるかに優れています (ユニオンは必要ありません)。そして、dict_transこれは「ジャンクション」テーブルになり、2 つの外部キーがあり、その新しい個別の言語 - 単語テーブルを指します。

于 2013-05-05T08:14:19.510 に答える