Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个表中最常出现在另一个表中的MYSQL条目_Mysql_Sql - Fatal编程技术网

一个表中最常出现在另一个表中的MYSQL条目

一个表中最常出现在另一个表中的MYSQL条目,mysql,sql,Mysql,Sql,我有两张桌子、两位作者和两本书 authors包含唯一的authorId books还将其作为外键包含 我需要知道那些书最多的作者。如果两位或两位以上的作者并列出了最多的图书数量,我需要向两位作者展示 我已经能够通过首先获得最大计数来实现这一点 SELECT @maxCount := (MAX(counter)) FROM (SELECT count(*) AS counter FROM books GROUP BY authorId) AS counts; 然后使用它来获取具有该计数的ID,

我有两张桌子、两位作者和两本书

authors包含唯一的authorId

books还将其作为外键包含

我需要知道那些书最多的作者。如果两位或两位以上的作者并列出了最多的图书数量,我需要向两位作者展示

我已经能够通过首先获得最大计数来实现这一点

SELECT @maxCount := (MAX(counter)) FROM (SELECT count(*) AS counter FROM books GROUP BY authorId) AS counts;
然后使用它来获取具有该计数的ID,作为我的作者选择的一部分

SELECT * 
FROM authors 
WHERE authorId IN (
    SELECT authorId 
    FROM books 
    GROUP BY authorId 
    HAVING COUNT(*) = @maxCount
);
有人告诉我,我不允许使用变量,如果表变得非常大,我所做的工作效率会非常低

我是不是漏掉了什么明显的东西?有没有一种方法可以在一条语句中不使用变量(或临时表),也不必对整个books表进行两次选择/分组

SELECT author, COUNT(*)
FROM authors
JOIN books
ON authors.authorId=books.AuthorId
GROUP BY author
ORDER BY COUNT(*) DESC
我会给你一个列表,按每个作者的图书数量排序。我附近没有一个实例可供测试,并且倾向于避开嵌入的变量,但期望类似于

SELECT *
FROM (
  SELECT author
  , @maxcount:=IF(COUNT(*)>@maxcount,COUNT(*), @maxcount) 
  , COUNT(*) AS cnt
  FROM authors
  JOIN books
  ON authors.authorId=books.AuthorId
  GROUP BY author
  ORDER BY COUNT(*) DESC
) ilv
WHERE cnt=@maxcount;
大型数据集的性能仍然很差(即使索引正确)。如果必须经常使用100000个记录运行此查询,那么您可能会考虑对数据进行反编译。

我会给你一个列表,按每个作者的图书数量排序。我附近没有一个实例可供测试,并且倾向于避开嵌入的变量,但期望类似于

SELECT *
FROM (
  SELECT author
  , @maxcount:=IF(COUNT(*)>@maxcount,COUNT(*), @maxcount) 
  , COUNT(*) AS cnt
  FROM authors
  JOIN books
  ON authors.authorId=books.AuthorId
  GROUP BY author
  ORDER BY COUNT(*) DESC
) ilv
WHERE cnt=@maxcount;

大型数据集的性能仍然很差(即使索引正确)。如果你必须经常使用100000个记录来运行这个查询,那么你可以考虑对数据进行反编译。您可以向其添加限制1,以仅获取一个实例

SELECT A.authorId, A.name, COUNT(*) AS num_books
FROM authors A
INER JOIN books B
ON A.authorId=B.AuthorId
GROUP BY A.authorId, A.name
ORDER BY COUNT(*) DESC
LIMIT 1
但是,如果您想获得所有共享最大数量图书的作者,最好的办法是将max(count)存储在一个变量或temp表中,并在第二次查询中使用它

例如,您可以将信息存储在以下临时表中

CREATE TEMPORARY TABLE IF NOT EXISTS maxBooks AS (
    SELECT authorId, COUNT(*)  AS num_books
    FROM books 
    GROUP BY authorId
    ORDER BY COUNT(*) DESC
    LIMIT 1
)

现在您可以将其加入到表中,以获得等于最大计数的计数

Symcbean解决方案非常好。。。您可以向其添加限制1,以仅获取一个实例

SELECT A.authorId, A.name, COUNT(*) AS num_books
FROM authors A
INER JOIN books B
ON A.authorId=B.AuthorId
GROUP BY A.authorId, A.name
ORDER BY COUNT(*) DESC
LIMIT 1
但是,如果您想获得所有共享最大数量图书的作者,最好的办法是将max(count)存储在一个变量或temp表中,并在第二次查询中使用它

例如,您可以将信息存储在以下临时表中

CREATE TEMPORARY TABLE IF NOT EXISTS maxBooks AS (
    SELECT authorId, COUNT(*)  AS num_books
    FROM books 
    GROUP BY authorId
    ORDER BY COUNT(*) DESC
    LIMIT 1
)

现在,您可以将其加入到表中,以获得等于最大计数的计数

这将提供所有作者和书籍计数,而我希望仅限于书籍最多的作者…我仍在键入!。。。。但是,如果您知道不太可能有超过20位作者具有相同的max count,那么您可以在第一个查询中添加LIMIT 0,20(并忽略那些具有ferwer than max的作者)。这对性能没有帮助,但会使代码更具可读性。第二个查询修复了我的问题,两次选择和分组书籍,并提供了我期望的结果集。据一位同事告诉我的,mysql缺少在没有临时表或变量的情况下完成这项工作所需的分析函数。我不知道这是不是真的,但我会假设是真的,并同意你的答案。谢谢。不,SQL缺少此类问题所需的分析功能。MySQL提供了变量(和过程SQL)来解决这个问题。这给了我所有作者和书籍数量,而我只想限制到拥有最多书籍的作者……我还在打字!。。。。但是,如果您知道不太可能有超过20位作者具有相同的max count,那么您可以在第一个查询中添加LIMIT 0,20(并忽略那些具有ferwer than max的作者)。这对性能没有帮助,但会使代码更具可读性。第二个查询修复了我的问题,两次选择和分组书籍,并提供了我期望的结果集。据一位同事告诉我的,mysql缺少在没有临时表或变量的情况下完成这项工作所需的分析函数。我不知道这是不是真的,但我会假设是真的,并同意你的答案。谢谢。不,SQL缺少此类问题所需的分析功能。MySQL提供变量(和过程SQL)来解决这个问题。