我可以在SELECT查询中重复使用计算的字段吗?

有没有办法在mysql语句中重用计算的字段。 我得到错误“unknown column total_sale”为:

SELECT s.f1 + s.f2 as total_sale, s.f1 / total_sale as f1_percent FROM sales s 

或者我必须重复计算,如果我添加了所有我需要的计算,这将使一个非常长的SQL语句。

 SELECT s.f1 + s.f2 as total_sale, s.f1 / (s.f1 + s.f2) as f1_percent FROM sales s 

当然我可以在我的PHP程序中做所有的计算。

是的,你可以重用variables。 这是你如何做到的:

 SELECT @total_sale := s.f1 + s.f2 as total_sale, s.f1 / @total_sale as f1_percent FROM sales s 

阅读更多关于它在这里: http : //dev.mysql.com/doc/refman/5.0/en/user-variables.html

[注意:这个行为是不确定的。 根据MySQL文档:]

作为一般规则,您不应该为用户variables赋值并在相同的语句中读取该值。 您可能会得到您所期望的结果,但这并不能保证。

以下似乎在我的MySQL 5.5testing中工作得很好:

 SELECT s.f1 + s.f2 as total_sale, s.f1 / (SELECT total_sale) as f1_percent FROM sales s 

只有跨平台支持的方法是使用派生表/内联视图:

 SELECT x.total_sale, x.f1 / x.total_sale as f1_percent FROM (SELECT s.f1, s.f1 + s.f2 as total_sale, FROM sales s) x 

你可以使用一个子select:

 select tbl1.total_sale, tbl1.f1/tbl1.total_sale as f1_percent from (select s.f1+s.f2 AS total_sale, s.f1 from sales s) as tbl1; 

您可以使用子查询,如下所示:

 SELECT h.total_sale, s.f1 / h.total_sale AS f1_percent FROM sales s, (SELECT id, f1 + f2 AS total_sale FROM sales) h WHERE s.id = h.id 

编辑:
固定的笛卡尔积,假设主键是id
这应该等同于优化后的OMG Ponies的解决scheme,但是如果你需要更多的子查询,我认为它会变得更难阅读。

我一直在testing以下,似乎一直工作,也许有这个原因,是因为我已经预定义variables@total_sales作为一个值不是一个string,并没有重新定义其types在select声明?

如果我做了以下

  set @total_sales = 0; SELECT @total_sale := s.f1 + s.f2 as total_sale, s.f1 / @total_sale as f1_percent FROM sales s 

我看了这里的各种答案,做了一些实验。

具体来说,我正在使用MariaDB 10.1。

对于一个“简单”的事情,你可以做他的评论中罗伯特·D提出的build议:

 SELECT Price_Per_SqFt, (Price_Per_SqFt/2) AS col1, (SELECT col1 + 1) AS col2 FROM Items 

如果您正在使用某种具有内部联接的集合函数,则不能使用此function,但是您可以将此方法与内部联接方法结合使用,如下所示(NB VAT =“销售税”…和NB以财务数据币种字段通常有4位小数,我认为这是历史…)

 SELECT invoices.invoiceNo, invoices.clientID, invoices.Date, invoices.Paid, invoicesWithSubtotal.Subtotal, ROUND( CAST( Subtotal * invoices.VATRate AS DECIMAL( 10, 4 )), 2 ) AS VAT, (SELECT VAT + Subtotal) AS Total FROM invoices INNER JOIN ( SELECT Sum( invoiceitems.Charge ) AS Subtotal, invoices.InvoiceNo FROM invoices INNER JOIN invoiceitems ON invoices.InvoiceNo = invoiceitems.InvoiceNo GROUP BY invoices.InvoiceNo ) invoicesWithSubtotal ON invoices.InvoiceNo = invoicesWithSubtotal.InvoiceNo 

我想用上面的方式创build一个View来列出他们的小计,增值税和总计发票…事实certificate,MariaDB(并且几乎可以肯定MySQL)不允许嵌套在FROM子句中。 然而,这很容易解决,通过第一个View列出InvoiceNoSubtotal ,然后作出第二个View引用第一个。 在性能方面,我完全不知道这种双View安排。