[英]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
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: 此方法不需要内联视图(派生表),如果要包含多个条件的标志,则此方法可能有效:
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
(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.