0

次のクエリがあります

SELECT s.s_id, s.t_id, c.c_id, c.desc, sm.user_id
FROM s s
INNER JOIN c c
ON s.c_id=c.c_id
INNER JOIN sm sm
ON s.t_id = sm.t_id
WHERE s.c_id=8;

次の結果セットを返します

s.s_id  s.t_id  c.c_id  c.desc     sm.user_id
3       123     8       something  2
3       123     8       something  2
3       123     8       something  1
4       456     8       something  2
4       456     8       something  2

私はしたいと思います

  1. ユーザーが製品を所有しているかどうかを示す追加の列を結果セットに作成します (これにはCASE構文の使用が含まれます)
  2. 一意のもののみを表示するs.s_id(これには を使用する必要がありますGROUP BY s.s_id)

たとえばs.c_id=8sm.user_id=1結果セットは次のようになります

s.s_id  s.t_id  c.c_id  c.desc      sm.user_id does_user_own_product
3       123     8       something   1          yes
4       456     8       something   2          no

の場合、少なくとも 1 つあるためs.s_id=3、 の値はdoes_user_own_productです。が存在しないため 、 の値はです。yessm.user_id=1 WHERE s.s_id=3s.s_id=4does_user_own_productnosm.user_id=1 WHERE s.s_id=4

たとえばs.c_id=8sm.user_id=2結果セットは次のようになります

s.s_id  s.t_id  c.c_id  c.desc      sm.user_id does_user_own_product
3       123     8       something   1          yes
4       456     8       something   2          yes

の場合、少なくとも 1 つあるためs.s_id=3、 の値はdoes_user_own_productです。の場合、少なくとも 1 つあるため 、 の値はです。yessm.user_id=2 WHERE s.s_id=3s.s_id=4does_user_own_productyessm.user_id=2 WHERE s.s_id=4

s.c_idと の値を指定すると、上記の 2 つのサブセットを達成するための適切なクエリは何でしょうか。sm.user_id

編集 ユーザーが製品を所有することの意味について、混乱があることを認識しています。

ユーザーの ID が sm.user_id にある場合、ユーザーはその s.s_id を所有しています。

たとえば、元の結果セットでは

s.s_id  s.t_id  c.c_id  c.desc     sm.user_id
3       123     8       something  2
3       123     8       something  2
3       123     8       something  1
4       456     8       something  2
4       456     8       something  2

ユーザー 1 と 2 は s.s_id 3 を所有し、ユーザー 2 のみが s.s_id 4 を所有しています。

4

2 に答える 2

4

これを行います:http://www.sqlfiddle.com/#!2/e4c84/21

MySql の強みを利用する:

set @userInquired := 1;

select s_id, t_id, c_id, dsc, 
    bit_or(user_id = @userInquired) as does_user_own_product
from tbl
group by s_id;

set @userInquired := 2;

select s_id, t_id, c_id, dsc, 
    bit_or(user_id = @userInquired) as does_user_own_product
from tbl
group by s_id;

共通分母 SQL:

set @userInquired := 1;

select s_id, t_id, c_id, dsc, 

  case when sum(case when user_id = @userInquired then 1 end) > 0 then
     1
  else
     0
  end as does_user_own_product

from tbl
group by s_id;


set @userInquired := 2;

select s_id, t_id, c_id, dsc, 

  case when sum(case when user_id = @userInquired then 1 end) > 0 then
     1
  else
     0
  end as does_user_own_product

from tbl
group by s_id;

共通分母 SQL。データベースに適切なブール値がない場合の最短の方法は、 と の組み合わせを使用しcase whenますmax

set @userInquired := 1;

select s_id, t_id, c_id, dsc, 

  max(case when user_id = @userInquired then 1 else 0 end) 
       as does_user_own_product

from tbl
group by s_id;



set @userInquired := 2;

select s_id, t_id, c_id, dsc, 

  max(case when user_id = @userInquired then 1 else 0 end) 
       as does_user_own_product

from tbl
group by s_id;
于 2012-05-10T01:04:53.910 に答える
2

多分このように:

SELECT s.s_id, s.t_id, c.c_id, c.desc, sm.user_id,
  MAX(sm.user_id = @userid) AS does_user_own_product
FROM s s
INNER JOIN c c
ON s.c_id=c.c_id
INNER JOIN sm sm
ON s.t_id = sm.t_id
WHERE s.c_id=8
GROUP BY s.s_id;

正直なところ、 GROUP BY に含まれておらず、集計もされていない列 ( c.c_idc.desc、 など) をプルする意味はあまりありません。sm.user_id(はい、MySQL ではこれを行うことができますが、これらの値はあなたの場合にはあまり意味がないようです。)

于 2012-05-10T01:12:50.700 に答える