如果值大于平均值,MySQL将显示数据

问题描述 投票:0回答:3

我有这个查询,我想选择或显示书籍数量高于平均值的作者。

到目前为止,我得到的平均书籍数量的查询如下:

SELECT AVG(c.quantity) AS 'Average'
FROM(
SELECT al.autores_DNI AS 'Author',COUNT(*) AS 'quantity'
FROM autores_has_libros AS al
GROUP BY al.autores_DNI
) AS c

那么我怎样才能选择(显示)那些书籍数量高于平均值的作者?

此查询列出了作者的书籍数量:

SELECT al.autores_DNI AS 'Author',COUNT(*) AS 'quantity'
    FROM autores_has_libros AS al
    GROUP BY al.autores_DNI

我试过了:

SELECT a.first_name 
FROM autores AS a
HAVING (
SELECT al.autores_DNI AS 'Author',COUNT(*) AS 'quantity'
    FROM autores_has_libros AS al
    GROUP BY al.autores_DNI
)
> (
SELECT AVG(c.quantity) AS 'Average'
    FROM(
    SELECT al.autores_DNI AS 'Author',COUNT(*) AS 'quantity'
    FROM autores_has_libros AS al
    GROUP BY al.autores_DNI
    ) AS c
)

但这不起作用

mysql
3个回答
2
投票

HAVING子句中的第一个子查询不仅返回当前作者的计数,而是返回所有其他子句的计数。但是用作值的SELECT只能返回一个值。

相反,您应该加入子查询。

SELECT a.first_name
FROM aotores AS a
JOIN (
    SELECT al.autores_DNI AS Author,COUNT(*) AS quantity
    FROM autores_has_libros AS al
    GROUP BY Author) AS al ON al.Author = a.DNI
JOIN (
    SELECT AVG(c.quantity) AS Average
    FROM (
        SELECT COUNT(*) AS quantity
        FROM autores_has_libros AS al
        GROUP BY al.autores_DNI) AS c
) AS av ON al.quantity > av.Average

顺便说一句,在MySQL中,你使用反引号来引用标识符,而不是单引号。单引号用于创建文字字符串。


0
投票

您可以尝试在变量中保存平均值,然后执行选择:

Set @avg = SELECT AVG(c.quantity) AS 'Average'
FROM(
SELECT al.autores_DNI AS 'Author',COUNT(*) AS 'quantity'
FROM autores_has_libros AS al
GROUP BY al.autores_DNI
) AS c

SELECT al.autores_DNI AS 'Author',COUNT(*) AS 'quantity'
FROM autores_has_libros AS al where COUNT(*) >= @avg

我不确定这是否有用,但你可以对此有所了解。


0
投票

如果要使用一个sql语句获取结果,可以尝试以下sql:

SELECT a.first_name FROM autores AS a 
RIGHT JOIN 
(
    SELECT autores_DNI AS Author, COUNT(*) AS quantity
    FROM autores_has_libros WHERE quantity > (
        SELECT AVG(quantity) AS Average FROM
        (
            SELECT autores_DNI AS Author, COUNT(*) AS quantity
            FROM autores_has_libros
            GROUP BY autores_DNI
        )
    )
    GROUP BY autores_DNI
) b ON a.author = b.Author

但是,我建议你可以在比较之前使用语言代码来获得平均值,或者使用mysql程序。

© www.soinside.com 2019 - 2024. All rights reserved.