1

stackoverflow でこの問題に関するいくつかの質問を読みました: ゼロの合計を含むすべての項目の合計を表示するには、正しい結合で COUNT を使用する必要があるようです。

数時間の頭痛の後、私は本当に自分のケースでそれを作ることができません...

さて、私は2つのテーブルを持っています。最初のものは「words2」と呼ばれ、単語のリストがあります。2 つ目は「links2」と呼ばれます。idWord1 と idWord2 の 2 つの単語をリンクしています。(2つの同じ単語をつなぐリンクはありません)

単語ごとに、リンクがない場合でも、使用されているリンクの数を知りたいです。

これは私のクエリです:

SELECT *, COUNT(*) AS qty  
FROM ( 
    SELECT *
    FROM words2
    LEFT OUTER JOIN links2 AS linksA ON words2.idWord = linksA.idWord1 

    UNION

    SELECT *
    FROM words2
    LEFT OUTER JOIN links2 AS linksB ON words2.idWord = linksB.idWord2
) AS tmp
WHERE idUser = 3 AND linkType = 'individual'
GROUP BY word ORDER BY word

表示されていない未使用の単語の結果がない限り、正常に機能します。

ご助力ありがとうございます!

4

2 に答える 2

3

元のクエリでこれを行うには、count 呼び出しを に変更しますCOUNT(idWord1)。これにより、idWord1 が NOT NULL である回数がカウントされます。現在、行数期間をカウントしているため、ゼロを取得する必要がある場所で 1 を取得します。

サンプル データセットは次のとおりです。

words2
-------
idWord
-------
foo
bar
baz
biz
buzz

links2
-------
idWord1 | idWord2
-------
foo     | bar
foo     | baz
bar     | baz
buzz    | foo
buzz    | bar

idUser(このデータセットはフィールドとフィールドを無視しlinkTypeます。元の質問ではフィールドの使用方法が説明されておらず、回答に関連していないように見えるためです。)

データセットでクエリを実行すると、次のようになります。

idWord | idWord1 | idWord2 | linkCount
--------------------------------------
bar    | bar     | baz     | 3
baz    | NULL    | NULL    | 2
biz    | NULL    | NULL    | 1
buzz   | buzz    | foo     | 2
foo    | foo     | bar     | 3

COUNT(*)また、使用しているストレージ エンジンによっては、より高価になることにも注意してください。詳細については、この他の質問を参照してください。

カウントを に変更すると、次のようにCOUNT(idWord1)なります。

idWord | idWord1 | idWord2 | linkCount
--------------------------------------
bar    | bar     | baz     | 3
baz    | NULL    | NULL    | 2
biz    | NULL    | NULL    | 0
buzz   | buzz    | foo     | 2
foo    | foo     | bar     | 3

ORサブクエリを使用せず、ステートメントを使用して words2 を links2 に結合する、さらに単純なクエリを次に示します。

SELECT
  words2.idWord
  -- this will count the number of links to each word
  -- if there are no links the COUNT() call will return 0
  , COUNT(idWord1) AS linkCount
FROM words2
  LEFT JOIN links2
    ON words2.idWord = links2.idWord1
      OR words2.idWord = links2.idWord2
GROUP BY words2.idWord
ORDER by words2.idWord

サンプル データセットで実行すると、次の結果が得られます。

idWord | linkCount
-------------------
bar    | 3
baz    | 2
biz    | 0
buzz   | 2
foo    | 3
于 2011-07-01T21:38:03.797 に答える
0
SELECT
    w.idWord
  , ( SELECT COUNT(*) 
      FROM links2 AS l
      WHERE l.idWord1 = w.idWord
    ) +
    ( SELECT COUNT(*) 
      FROM links2 AS l
      WHERE l.idWord2 = w.idWord
    ) AS linkCount
FROM words2 AS w

また

SELECT
    w.idWord
  , ( SELECT COUNT(*) 
      FROM links2 AS l
      WHERE l.idWord1 = w.idWord
         OR l.idWord2 = w.idWord
    ) AS linkCount
FROM words2 AS w
于 2011-07-01T23:28:52.017 に答える