简体   繁体   English

mysql查询是否有可能返回true / false而不是值?

[英]Is it possible for a mysql query to return true/false instead of values?

I have a table: 我有一张桌子:

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

I have a list of values - pizza, wings, breadsticks, and salad. 我有一个价值清单 - 比萨饼,翅膀,面包棒和沙拉。 I need a way to just get a true/false value if a customer has at least one record containing each of these. 如果客户至少有一条包含其中每条记录的记录,我需要一种方法来获得真/假值。 Is that possible with a mysql query, or do I just have to do a select distinct(orderComponent) for each user and use php to check the results? 这是可能的mysql查询,或者我只需要为每个用户做一个select distinct(orderComponent)并使用php检查结果?

If you are just looking to see if the customer has ordered all items, then you can use: 如果您只是想查看客户是否订购了所有商品,那么您可以使用:

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

See SQL Fiddle with Demo 请参阅SQL Fiddle with Demo

If you want to expand this out, to see if the custid has ordered all items in a single order, then you can use: 如果你想扩展它,看看custid是否订购了单个订单中的所有商品,那么你可以使用:

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

See SQL Fiddle with Demo 请参阅SQL Fiddle with Demo

If you only want the custid and the true/false value, then you can add distinct to the query. 如果您只想要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

See SQL Fiddle with Demo 请参阅SQL Fiddle with Demo

Or by custid and orderid: 或者通过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

See SQL Fiddle with Demo 请参阅SQL Fiddle with Demo

select case when 
count(distinct orderComponent) = 4 
then 'true' 
else 'false' 
end as bool
from tbl
where custID=1

Here's one approach. 这是一种方法。 This approach does not require an inline view (derived table), and can be effective if you want to include flags for multiple conditions: 此方法不需要内联视图(派生表),如果要包含多个条件的标志,则此方法可能有效:

EDIT: 编辑:

This returns custID that has a row for all four items: 这将返回包含所有四个项的行的custID

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

ORIGINAL ANSWER: 原始答案:

(This checked for a customer "order" that had all four items, rather than just a "custID".) (这检查了具有所有四个项目的客户“订单”,而不仅仅是“custID”。)

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

That will get the "orders" that have all four items. 这将得到包含所有四个项目的“订单”。 If you want to return just values for custID, then use the query above as an inline view (wrap it in another query) 如果只想返回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

@EmmyS: you can do it both ways. @EmmyS:你可以两种方式做到。 If you want to check using MySql use: 如果要使用MySql检查,请使用:

SELECT @rowcount:=COUNT(*) FROM orderComponent Where (Your Conditions);
IF (@rowcount > 0) THEN
    'True'
ELSE
    'False'
END IF

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM