0

私はこの構造を持つテーブルを持っています:

table
id      | site_id
-------------------
240     | 1
240     | 2
240     | 3
320     | 1
320     | 2
421     | 1
520     | 2
-------------------

30万件のレコード

今、各レコード (id) に対して yes または no を返すクエリを作成しようとしています。

たとえば、id 240 のレコードの site_id が 1のみの場合は「はい」を返し、2、3 などがある場合は「いいえ」を返します。

どのようにアプローチするかはわかりませんが、結果のサンプルは次のとおりです。

result_table
.-----------------------.
| id        | result    |
|-----------------------|
| 240       |   No      |  -- has a site_id 1, 2 and 3
| 320       |   No      |  -- has a site_id 1 and 2
| 421       |   Yes     |  -- has a site_id 1 only
| 520       |   No      |  -- has a site_id  2
'-----------------------'

ここに私がこれまでに持っているクエリがありますが、間違っているようです

SELECT CASE WHEN count(id) > 1 THEN 'N' ELSE 'Y' END as Result 
FROM table sm 
WHERE sm.site_id IN (1) 
AND sm.site_id NOT IN (2,3,4,5,6,7,8,9) 
AND id = 240  

アップデート

SOこれが私の完全なクエリです。@gordonからの回答を追加しました

SELECT 
    m.merchant_name,
    m.merchant_id,
    ut.realname,
    a.affiliate_name,
    (select (case when count(site_id) = 1 then 'Yes' else 'No' end) as result
    from site_merchant sm
    WHERE sm.merchant_id = m.merchant_id
    group by merchant_id) as isTjoos,   -- y or no
    (select (case when count(site_id) = 2 then 'Yes' else 'No' end) as result
    from site_merchant sm
    WHERE sm.merchant_id = m.merchant_id
    group by merchant_id) as isUCOnly
--  isdlkonly   -- y or no
FROM merchant m
LEFT JOIN merchant_editor_assignment mea ON mea.merchant_id = m.merchant_id
LEFT JOIN user_table ut ON ut.user_id = mea.user_id
LEFT JOIN affiliate a ON a.affiliate_id = m.affiliate_id_default
4

6 に答える 6

3

私はこの質問を、site_id の値が 1 つだけの ID が必要であると解釈しました。質問の例を、site_id = 1 の例として取り上げました。これを行うには:

使用したいcount(distinct)

select id, (case when count(distinct site_id) = 1 then 'Yes' else 'No' end) as result
from site_merchant sm
group by id

少し効率的なバージョンは、site_id が決して NULL ではないことを前提として、min()andを使用することです。max()

select id, (case when min(site_id) = max(site_id) then 'Yes' else 'No' end) as result
from site_merchant sm
group by id

これは、通常、min と max は よりも少し処理が少なくて済むためですcount(distinct)

site_id が「1」であることを確認したい場合は、句に条件and min(site_id) = 1を追加します。when

site_id が 1 で、行が 1 つだけあることを確認したい場合は、次のようにします。

select id, (case when count(site_id) = 1 and min(site_id) = 1 then 'Yes' else 'No' end) as result
from site_merchant sm
group by id

また、行が 1 つだけであることを確認する場合は、次のようにします。

select id, (case when count(site_id) = 1 then 'Yes' else 'No' end) as result
from site_merchant sm
group by id
于 2013-02-25T20:11:34.240 に答える
1
SELECT
  it,
  CASE WHEN COUNT(CASE WHEN site_id THEN 1 END)=1
            AND COUNT(CASE WHEN site_id!=1 THEN 1 END)=0 THEN 'Yes'
       ELSE 'No'
  END
FROM sm
GROUP BY it

ここでフィドルを参照してください。

于 2013-02-25T20:11:16.610 に答える
1
SELECT ID, CASE WHEN EXTRA > 1 THEN 'No' ELSE 'Yes' END AS Result
FROM
(SELECT ID, Sum(site_id) AS Extra
 from myTable
 GROUP BY ID
) AS Test

編集: これは MySQL で動作するはずです。私はそれに取り組んでいません。
アイデアはSUM、site_id を上げることです。site_id = 1のみのレコードの場合、合計は 1 になります。

于 2013-02-25T20:11:30.000 に答える
0

これが私が見つけた解決策です。@Gordons クエリを使用して開始しましたが、欠けていたのは site_id であり、group by は必要ありませんでした。

SELECT 
    m.merchant_name,
    m.merchant_id,
    ut.realname,
    a.affiliate_name,
    (select (case when count(*)>0  then 'No' else 'Yes' end) as result
    from site_merchant sm
    WHERE sm.merchant_id = m.merchant_id
    AND site_id != 1) as isTjoos,
    (select (case when count(*)> 0 then 'No' else 'Yes' end) as result
    from site_merchant sm
    WHERE sm.merchant_id = m.merchant_id
    AND site_id != 2) as isUCOnly,
    (select (case when count(*)> 0 then 'No' else 'Yes' end) as result
    from site_merchant sm
    WHERE sm.merchant_id = m.merchant_id
    AND site_id != 3) as isDLKonly
FROM merchant m
LEFT JOIN merchant_editor_assignment mea ON mea.merchant_id = m.merchant_id
LEFT JOIN user_table ut ON ut.user_id = mea.user_id
LEFT JOIN affiliate a ON a.affiliate_id = m.affiliate_id_default

お手伝いありがとう。

于 2013-02-25T23:05:25.203 に答える
0

私なら、Having Count ステートメントを使用します。そんな感じ:

SELECT site_id
FROM site_merchant
HAVING (count(merchant_id) > 1)
GROUP BY site_id;
于 2013-02-25T20:09:42.367 に答える
0

クエリが複雑すぎるようです。始めに、なぜIN(1)NOT IN(2,3...9)? AND id = 240そして、「結果サンプル」が明らかにそれを望んでいないのに、なぜ単一の ID ( ) に制限するのでしょうか? 意味がありません。これはどう?

SELECT CASE WHEN count(merchant_id) > 1 THEN 'N' ELSE 'Y' END as isTjoos 
FROM site_merchant
GROUP BY site_id;
于 2013-02-25T20:05:58.220 に答える