15

私はテーブルを持っています:

custID    orderID    orderComponent
=====================================
1          123        pizza
1          123        wings
1          234        breadsticks
1          239        salad
2          456        pizza
2          890        salad

ピザ、翼、ブレッドスティック、サラダなどの値のリストがあります。顧客がこれらのそれぞれを含むレコードを少なくとも1つ持っている場合、真/偽の値を取得する方法が必要です。それはmysqlクエリで可能ですか、それともselect distinct(orderComponent)ユーザーごとにを実行し、phpを使用して結果を確認する必要がありますか?

4

4 に答える 4

14

顧客がすべての商品を注文したかどうかを確認するだけの場合は、次を使用できます。

select t1.custid,
  case when t2.total is not null 
    then 'true'
    else 'false'
  end OrderedAll
from yourtable t1
left join
(
  select custid, count(distinct orderComponent) Total
  from yourtable
  where orderComponent in ('pizza', 'wings', 'breadsticks', 'salad')
  group by custid
  having count(distinct orderComponent) = 4
) t2
  on t1.custid = t2.custid

デモで SQL Fiddle を参照してください

これを拡張して、custidが 1 回の注文ですべての商品を注文したかどうかを確認するには、次を使用できます。

select t1.custid,
  t1.orderid,
  case when t2.total is not null 
    then 'true'
    else 'false'
  end OrderedAll
from yourtable t1
left join
(
  select custid, orderid, count(distinct orderComponent) Total
  from yourtable
  where orderComponent in ('pizza', 'wings', 'breadsticks', 'salad')
  group by custid, orderID
  having count(distinct orderComponent) = 4
) t2
  on t1.custid = t2.custid
  and t1.orderId = t2.orderid

デモで SQL Fiddle を参照してください

custid と true/false 値のみが必要な場合はdistinct、クエリに追加できます。

select distinct t1.custid,
  case when t2.total is not null 
    then 'true'
    else 'false'
  end OrderedAll
from yourtable t1
left join
(
  select custid, count(distinct orderComponent) Total
  from yourtable
  where orderComponent in ('pizza', 'wings', 'breadsticks', 'salad')
  group by custid
  having count(distinct orderComponent) = 4
) t2
  on t1.custid = t2.custid

デモで SQL Fiddle を参照してください

または custid と orderid によって:

select distinct 
  t1.custid,
  t1.orderid,
  case when t2.total is not null 
    then 'true'
    else 'false'
  end OrderedAll
from yourtable t1
left join
(
  select custid, orderid, count(distinct orderComponent) Total
  from yourtable
  where orderComponent in ('pizza', 'wings', 'breadsticks', 'salad')
  group by custid, orderID
  having count(distinct orderComponent) = 4
) t2
  on t1.custid = t2.custid
  and t1.orderId = t2.orderid

デモで SQL Fiddle を参照してください

于 2013-01-15T17:00:22.297 に答える
5
select case when 
count(distinct orderComponent) = 4 
then 'true' 
else 'false' 
end as bool
from tbl
where custID=1
于 2013-01-15T16:51:12.810 に答える
2

これが1つのアプローチです。このアプローチはインライン ビュー (派生テーブル) を必要とせず、複数の条件のフラグを含める場合に効果的です。

編集:

custIDこれは、4 つの項目すべてを含む行を返します。

SELECT t.custID
     , MAX(IF(t.orderComponent='breadsticks',1,0))
       + MAX(IF(t.orderComponent='pizza',1,0))
       + MAX(IF(t.orderComponent='salad',1,0))
       + MAX(IF(t.orderComponent='wings',1,0)) AS has_all_four
  FROM mytable t
 GROUP BY t.custID
HAVING has_all_four = 4

元の答え:

(これは、単なる「custID」ではなく、4 つのアイテムすべてを含む顧客の「注文」をチェックします。)

SELECT t.custID
     , t.orderID
     , MAX(IF(t.orderComponent='breadsticks',1,0))
       + MAX(IF(t.orderComponent='pizza',1,0))
       + MAX(IF(t.orderComponent='salad',1,0))
       + MAX(IF(t.orderComponent='wings',1,0)) AS has_all_four
  -- , MAX(IF(t.orderComponent='breadsticks',1,0)) AS has_breadsticks
  -- , MAX(IF(t.orderComponent='pizza',1,0)) AS has_pizza
  -- , MAX(IF(t.orderComponent='salad',1,0)) AS has_salad
  -- , MAX(IF(t.orderComponent='wings',1,0)) AS has_wings
  FROM mytable t
 GROUP BY t.custID, t.orderID
HAVING has_all_four = 4

これにより、4 つのアイテムすべてを含む「注文」が取得されます。custID の値だけを返したい場合は、上記のクエリをインライン ビューとして使用します (別のクエリでラップします)。

SELECT s.custID
  FROM (
         SELECT t.custID
              , t.orderID
              , MAX(IF(t.orderComponent='breadsticks',1,0))
                + MAX(IF(t.orderComponent='pizza',1,0))
                + MAX(IF(t.orderComponent='salad',1,0))
                + MAX(IF(t.orderComponent='wings',1,0)) AS has_all_four
             FROM mytable t
            GROUP BY t.custID, t.orderID
           HAVING has_all_four = 4
       ) s
 GROUP BY s.custID
于 2013-01-15T17:13:19.663 に答える
0

@EmmyS: 両方の方法で実行できます。MySql を使用して確認する場合は、次を使用します。

SELECT @rowcount:=COUNT(*) FROM orderComponent Where (Your Conditions);
IF (@rowcount > 0) THEN
    'True'
ELSE
    'False'
END IF
于 2013-01-15T16:52:34.930 に答える