[英]How to select a sub-query with MySQL using the WHERE part?
我有2张桌子,看起来像:
money
表如下所示:
id type cash
1 54 3.23
2 293 1.12
3 181 4.00
plus
表如下所示:
id money_id bonus
1 3 0.50
2 2 0.10
我基本上想要从money
表中选择所有数据,包括money.cash
和从plus
表中获得的额外奖励(如果有的话),而我只想选择那些现金超过1.50的记录(包括奖金)。
所以我想要达到的结果是:
id type cash_full
1 54 3.23
2 181 4.50
我试图进行一些查询,但是当我要将cash_full
包含在WHERE语句中时,它总是显示错误。 除此之外,它可以完美地工作,我只是无法使用cash_full
列过滤查询。
SELECT mo.*,
IFNULL
(
mo.cash +
(
SELECT bonus
FROM plus as pu
WHERE mo.id = pu.money_id
), mo.cash
) as cash_full
FROM `money` as mo
WHERE cash_full >= 1.5
那么,该查询怎么可能不起作用? 我的问题有解决方案吗?
1.假设您每个货币id可以拥有一个以上的奖金:
将Money表中的值分组后,可以在hading子句中使用别名(使用mysql)
select mo.id, mo.type, mo.cash + sum(coalesce(p.bonus, 0)) as cash_full
from money mo
left join plus p on p.money_id = mo.id
group by mo.id, mo.type, mo.cash
having cash_full > 1.5
与其他数据库一起,您将不得不使用子查询,或者在hading子句中重复“ aliased”操作:
having mo.cash + sum(coalesce(p.bonus, 0)) > 1.5
2.假设每个钱ID的奖金不能超过一个
您可以执行子查询以避免重复“加法” *
select id, type, cash_full
from (
select mo.id, mo.type, mo.cash + coalesce(p.bonus, 0) as cash_full
from money mo
left join plus p on p.money_id = mo.id) s
where cash_full > 1.5;
一个简单的LEFT JOIN可以做到:
SELECT a.id, a.type, a.cash + IFNULL(SUM(b.bonus), 0) AS cash_bonus
FROM money a
LEFT OUTER JOIN plus b
ON a.id = b.money_id
GROUP BY a.id, a.type
HAVING cash_bonus > 1.50
请注意,这有点奇怪,因为它具有不在GROUP BY子句中的非聚合字段。 这在MySQL中应该没问题,但可能会在其他类型的SQL中引起问题。 在这种情况下,可能需要向子查询的LEFT JOIN:
SELECT a.id, a.type, a.cash + IFNULL(b.tot_bonus, 0) AS cash_bonus
FROM money a
LEFT OUTER JOIN
(
SELECT money_id, SUM(bonus) AS tot_bonus
FROM plus
GROUP BY money_id
) b
ON a.id = b.money_id
WHERE a.cash + IFNULL(b.tot_bonus, 0) > 1.50
尝试这个...
select mo.*,sum(mo.cash+ IFNULL(pl.cash_full,0)) as cash_full from money mo
LEFT JOIN plus pl on pl.money_id=mo.id and pl.cash_full >=1.5
我认为这可能对您有帮助
select m.id, m.type, (m.cash + p.bonus) as cash_full from money m, plus p WHERE m.id=p.money_id;
这是SQLFiddle来看看
SELECT mo.*, (mo.cash + IFNULL(p.bonus,0)) AS cash_full
FROM `money` as mo
LEFT JOIN `plus` AS p
ON p.money_id = mo.id
WHERE cash_full >= 1.5
尝试这个:
select m.*, (IFNULL(p.bonus,0)+ m.cash) as cash_full
from money m left join plus p
on m.id = p.id
and cash_full >= 1.50
如果使用SQL Server / MS Access,则使用ISNULL,Oracle使用NVL,My SQL使用IFNULL。
SELECT
M.ID,
M.TYPE,
M.CASH,
IFNULL(P.BONUS, 0) AS BONUS,
M.CASH + IFNULL(P.BONUS, 0) AS TOTAL
FROM
MONEY M
LEFT JOIN PLUS P ON
P.MONEY_ID = M.ID
WHERE
M.CASH + IFNULL(P.BONUS, 0) >= 1.5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.