有没有办法从嵌套查询中 return 计算值?

Is there a way to return a calculated value from a nested query?

好吧,我花了一个星期试图解决这个问题,但我似乎找不到我要找的东西。有两个类似的问题,我认为在看到伪(ish)代码后更容易解释。这是第一个

SELECT P_CODE, P_DESCRIPT, @diff
FROM PRODUCT
WHERE @diff :=
    (SELECT ROUND(ABS(P_PRICE -(SUM(P_PRICE)/COUNT(P_PRICE))),2)
    FROM PRODUCT
    WHERE P_PRICE in
        (SELECT P_PRICE
        FROM PRODUCT));

基本上,我有产品 table,我正在尝试 return 主键、描述以及产品价格与所有条目的平均价格之间的差异。在类似的注释中,这里是第二个问题

SELECT *, @val
FROM LINE
WHERE P_CODE in 
    (SELECT P_CODE
    FROM LINE
    HAVING COUNT(P_CODE) >
    (@val = (SELECT COUNT(*) FROM LINE)/(SELECT COUNT(DISTINCT P_CODE)
    FROM LINE)));

在这里,我正在尝试 return table 行(基本上是收据 table)中的所有字段,该条目的产品售出的商品数量超过平均售出数量

清楚我要用这些做什么吗?我正在尝试 return 其他值以及我只能使用来自另一个 table 的值计算的计算值(如果不清楚,则以列表形式)。我不太确定,但也许 JOIN 语句可以在这里工作?我是 mysql 的新手,还不太了解如何最好地使用 JOIN 语句。如果有人可以告诉我如何解决此类问题,或者至少向我指出描述如何执行此操作的 link(因为我没有找到一个)

加入returns平均价格的子查询:

SELECT p.p_code, p.p_descript, ROUND(ABS(p.p_price - x.avg_price)) AS price_diff
FROM product AS p
CROSS JOIN (
    SELECT AVG(p_price) AS avg_price
    FROM product
) AS x

注意有一个built-inAVG()函数,你不需要使用SUM()COUNT()。此外,WHERE p_price in (SELECT p_price FROM product) 毫无意义——该测试显然总是正确的。

SELECT l.*
FROM line AS l
JOIN (
    SELECT p_code, COUNT(*) AS code_count
    FROM line
    GROUP BY p_code
) AS l1 ON l.p_code = l1.p_code
JOIN (
    SELECT COUNT(*)/COUNT(DISTINCT p_code) AS avg_count
    FROM line
) AS x ON l1.code_count > x.avg_count

Basically, I have product table where I'm trying to return the primary key, description, and difference between the product's price and the average price for all entries

使用 MySQL 的用户变量会使查询更加困难。

有很多方法可以得到你需要的东西。

方法一

使用内部 select 或子查询

SELECT 
    PRODUCT.P_CODE
    , PRODUCT.P_DESCRIPT
    , ROUND(ABS((PRODUCT.P_PRICE) - (SELECT AVG(PRODUCT_INNER.P_PRICE) FROM PRODUCT AS PRODUCT_INNER)), 2) AS diff
FROM 
    PRODUCT

方法二

使用交叉连接

查询

SELECT 
    PRODUCT.P_CODE
    , PRODUCT.P_DESCRIPT
    , ROUND(ABS(PRODUCT.P_PRICE - product_avg.avg_product_price), 2) AS diff
FROM 
    PRODUCT
CROSS JOIN 
    (SELECT 
         AVG(PRODUCT.P_PRICE) AS avg_product_price
     FROM 
         PRODUCT) AS product_avg