0

2つの列からクエリ結果を差し引こうとしています。

テーブル:

 id |   word1   | lang1 |   word2   | lang2 |
----+-----------+-------+-----------+-------+
  1 | car       |   1   | car       |  15   |
  2 | table     |   1   | table     |  15   |
  3 | Chair     |   1   | cahair    |  13   |
  4 | CDplayer  |  15   | CDplayer  |   1   |
  5 | car       |   1   | car       |  13   |

言語1のword1で、まだ言語12に翻訳されていないすべての単語を取得したいので、この場合は議長になります。

テーブルには300万行あり、次のクエリの実行には1分かかります。

SELECT DISTINCT word1 
FROM `translations` 
WHERE lang1 = 1 
  AND lang2 != 15 
  AND NOT IN (SELECT word1 FROM `translations` WHERE lang2 == 15) 
LIMIT 10

両方の行を別々に選択するのは0.006秒と非常に高速array_diff()で、PHPでそれらを相互に減算するために使用できますが、MySQLで直接行うより簡単な方法がおそらくあります。

4

4 に答える 4

2
SELECT 
    origin.word1
FROM 
    ( SELECT DISTINCT word1
      FROM tableX 
      WHERE lang1 = 1
    ) AS origin
WHERE 
    NOT EXISTS
      ( SELECT *
        FROM tableX AS trans
        WHERE trans.lang1 =  1
          AND trans.lang2 = 15
          AND trans.word1 = origin.word1
      ) ;

これらのクエリを実行(lang1, word1)する前に、インデックスとインデックスを追加します。(lang1, lang2, word1)

このバリエーションを試すこともできます(そして両方のExplainプランを確認してください):

SELECT DISTINCT
      word1
FROM 
      tableX AS origin
WHERE 
      lang1 = 1
  AND 
      NOT EXISTS
      ( SELECT *
        FROM tableX AS trans
        WHERE trans.lang1 =  1
          AND trans.lang2 = 15
          AND trans.word1 = origin.word1
      ) ;
于 2013-01-10T20:23:34.753 に答える
0

これは簡単なはずです

SELECT
    m.id ,
    l.*
FROM mytable m
INNER JOIN (
            SELECT
                * 
            FROM mytable
            WHERE lang2 != 15
            GROUP BY id
) as l ON l.id = m.id
WHERE l.lang1 = 1
GROUP BY m.id
于 2013-01-10T19:58:42.120 に答える
0
SELECT DISTINCT NonTranslated.word1
from
(SELECT DISTINCT word1 FROM `translations` WHERE lang1 = 1 AND lang2 != 15)NonTranslated
left join
(SELECT DISTINCT word1 FROM `translations` WHERE lang1 = 1 AND lang2 = 15)Translated
on NonTranslated.word1 = Translated.word1
where Translated.word1 is NULL;

これの説明を教えてください。subqueryを選択するよりも速いかもしれないと思います。

PS:仮定:単語が一度翻訳されたとしても、リストに含まれることはありません。

于 2013-01-10T19:59:27.693 に答える
0

質問を完全に正しく理解しているかどうかはわかりません。集計は機能しますか?

select word1
from translations t
group by word1
having max(lang1 = 1) = 1 and
       max(lang2 = 15) = 0
于 2013-01-11T00:23:50.917 に答える