簡體   English   中英

如何使用WHERE部分使用MySQL選擇子查詢?

[英]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

參見SqlFiddle

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

SqlFiddle

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM