【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

下記のSQL文があります。

tableA内で、tableA.id(A.id)は重複があります。
tableA内でのtableA.id(A.id)の重複レコード数をcount関数などでSELECTしたいのですが、
下記SQL文からどのように付け加えたらいいのか、お分かりの方いますでしょうか?


SELECT
A.id as id,
A.xxx as xx,
A.yyy as yy,
B.zzz as zz
FROM
tableA A, tableB B
WHERE
A.id = B.id
AND
A.xxx = x
AND
A.yyy = y


なお、「A.yyy = y」という条件は、tableA.idの重複レコード数をカウントする上で必要な条件なのですが、
「A.xxx = x」という条件は、tableA.idの重複レコード数をカウントする上で、不要な条件です。

以上、よろしくお願いいたします。

A 回答 (4件)

こんな感じですか?



SELECT
A.id as id,
subA.COUNT,
A.xxx as xx,
A.yyy as yy,
B.zzz as zz
FROM
tableA AS A
LEFT JOIN (
SELECT id,COUNT(*) AS COUNT
FROM tableA
WHERE 1
AND A.xxx = x
AND A.yyy = y
GROUP BY id
) AS subA
ON A.id=subA.id
INNER JOIN tableB AS B
ON A.id = B.id
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

LEFT JOIN の中の 「A.xxx = x」という条件は
COUNTを出す際、不要な条件とみなし、
下記のようにしましたところ、上手く結果が出ました。

SELECT
A.id as id,
subA.COUNT as cnt,
A.xxx as xx,
A.yyy as yy,
B.zzz as zz
FROM
tableA AS A
LEFT JOIN (
SELECT id,COUNT(*) AS COUNT
FROM tableA
WHERE 1
AND yyy = y
GROUP BY id
) AS subA
ON A.id=subA.id
INNER JOIN tableB AS B
ON A.id = B.id
WHERE
A.xxx = x
AND A.yyy = y


解決はできましたが、
LEFT JOIN の中の 「WHERE 1」としている部分が
ありますが、これは何を意味するのでしょうか。
お手数ですが、ご回答、よろしくお願いいたします。

お礼日時:2010/03/22 05:50

>LEFT JOIN の中の 「WHERE 1」としている部分が


>ありますが、これは何を意味するのでしょうか。

すみません、ざっくり書いてしまったのでわかりにくかったですね。
WHERE 1とはphpMyAdminでも採用されているもので、ようは、
「全てのデータを抽出します」という意味です。
「WHERE true」ってことですね。
これにANDで条件をつないでいくとSQLが書きやすくなります。
SQLはプログラムに組み込んでつくるケースが多いですから
このような書き方が非常に重要です。

たとえば、A=1、B=2を条件とするとき
WHERE A=1、WHRE B=2、WHERE A=1 AND B=2を条件分けして
書くのはなにかと面倒です。
これをWHERE 1 AND A=1、WHERE 1 AND B=2、WHERE 1 AND A=1 AND B=2
とかくのはプログラム的には楽です。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。
よく分かりました。

お礼日時:2010/03/23 17:30

#1です。


>「A.xxx = x」という条件 不要な条件です。
を見落としていたので、以下の通りに訂正します。


select count(A.id) - count(distinct A.id) as multi_id
FROM
tableA A, tableB B
WHERE
A.id = B.id
AND
A.yyy = y

この回答への補足

ご回答いただき、ありがとうございます。

「count(A.id) - count(distinct A.id) as multi_id」
の部分を、下記の元のSQL文に加えたいのですが、
それは不可能でしょうか?

つまり、元のSQLでSELECTしたデータと同時に
SELECTしたいのです。

説明不足でしたが、元のSQLでSELECTされた、A.id as id
のみ、tableA内での重複レコードをカウントしたいのです。

SELECT
A.id as id,
A.xxx as xx,
A.yyy as yy,
B.zzz as zz
FROM
tableA A, tableB B
WHERE
A.id = B.id
AND
A.xxx = x
AND
A.yyy = y

以上、お手数ですが、よろしくお願いいたします。

補足日時:2010/03/21 13:45
    • good
    • 0

> 重複レコード数をcount関数などでSELECTしたいのですが、



select count(A.id) - count(distinct A.id) as multi_id
FROM
tableA A, tableB B
WHERE
A.id = B.id
AND
A.xxx = x
AND
A.yyy = y


ではどうなりますか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す