2016-10-08 6 views
0

У меня есть 2 таблицы, но связаны многие ко многим отношений так 3 таблицы:MySQL Предельные результаты на основе Join Table

Table Author : 
idAuthor, 
Name 

+----------+-------+ 
| idAuthor | Name | 
+----------+-------+ 
|  1 | Renee | 
|  2 | John | 
|  3 | Bob | 
|  4 | Bryan | 
+----------+-------+ 
Table Publication: 
idPublication, 
Title, 
Type, 
Date, 
Journal, 
Conference 

+---------------+--------------+------+-------------+------------+-----------+ 
| idPublication | Title  | Date | Type  | Conference | Journal | 
+---------------+--------------+------+-------------+------------+-----------+ 
|    1 | Flower thing | 2008 | book  | NULL  | NULL  | 
|    2 | Bees   | 2009 | article  | NULL  | Le Monde | 
|    3 | Wasps  | 2010 | inproceding | KDD  | NULL  | 
|    4 | Whales  | 2010 | inproceding | DPC  | NULL  | 
|    5 | Lyon   | 2011 | article  | NULL  | Le Figaro | 
|    6 | Plants  | 2012 | book  | NULL  | NULL  | 
+---------------+--------------+------+-------------+------------+-----------+ 
Table author_has_publication : 
Author_idAuthor, 
Publication_idPublication 

+-----------------+---------------------------+ 
| Author_idAuthor | Publication_idPublication | 
+-----------------+---------------------------+ 
|    1 |       1 | 
|    2 |       2 | 
|    3 |       3 | 
|    4 |       4 | 
|    1 |       5 | 
|    2 |       5 | 
|    3 |       5 | 
|    3 |       6 | 
+-----------------+---------------------------+ 

То, что я хочу сделать, это получить верхнюю X автор, имеющий наибольшее количество публикаций.

я достиг, чтобы получить результат АВЭК в idAuthor, имеющие наибольшее количество публикаций, используя этот запрос: SELECT Author_idAuthor, COUNT(*) as count FROM Author_has_publication GROUP BY Author_idAuthor ORDER BY count DESC; Я получаю список ид авторов, упорядоченный по количеству публикаций:

+-----------------+-------+ 
| Author_idAuthor | count | 
+-----------------+-------+ 
|    3 |  3 | 
|    2 |  2 | 
|    1 |  2 | 
|    4 |  1 | 
+-----------------+-------+ 

, но затем когда я пытаюсь выбрать автора, соответствующий верхнему X результирующего набора предыдущего запроса, у меня есть ошибка Я пытаюсь это SELECT TOP 2 FROM author WHERE (SELECT Author_idAuthor, COUNT(*) as count FROM Author_has_publication GROUP BY Author_idAuthor ORDER BY count DESC)=idAuthor; Я думаю, это может быть потому, что мой внутренний запрос возвращает 2 строки, и я делаю простой SELECT здесь или мне нужен JOIN, но я га нет идей, как использовать его здесь.

+0

Поделитесь некоторыми примерами ввода и вывода. Было бы легче помочь. Кроме того, я думаю, у вас возникли проблемы с отображением имен автора. –

+0

Я отредактировал, так как вы задали –

+0

Используете ли вы Sql или MySQL? Попробуйте приведенный ниже запрос @Alan Hay. Посмотрите, работает ли это. –

ответ

1

У MySQL нет ключевого слова TOP. Однако у него есть ключевое слово LIMIT. В любом случае ваш запрос недействителен.

Здесь есть пара вариантов. Ниже приведен пример коррелированных подзапросов: https://en.wikipedia.org/wiki/Correlated_subquery

SELECT 
    a.idAuthor, 
    a.Name , 
    (SELECT COUNT(*) from author_has_publication ahp WHERE 
     ahp.Author_idAuthor = a.idAuthor) AS publication_count 
FROM 
    author a 
ORDER BY 
    publication_count DESC 
LIMIT 2 

В ссылочных отмечается в статье, выше неэффективной, так как должен быть повторно выполнен для каждой строки результата подзапрос. Если вам действительно не нужен счет в наборе результатов, то ниже будет более эффективным, так как подзапрос некоррелирован и выполняется только один раз.

SELECT 
    a.idAuthor, 
    a.Name 
FROM 
    author a 
INNER JOIN 
    (select ahp.Author_idAuthor AS idAuthor, COUNT(*) as publication_count 
     FROM author_has_publication ahp GROUP BY ahp.Author_idAuthor LIMIT 2) 
     AS TEMP ON TEMP.idAuthor = a.idAuthor 
+0

говорит, что моя версия MySQL не поддерживает «LIMIT & IN/ВСЕ/ЛЮБОЙ/НЕКОТОРЫЙ подзапрос ' –

+0

Да, вы правы. См. Обновленный ответ, который использует встроенный выбор. –

+0

Это работает спасибо! Это тот же механизм, что и aj ты только что сделал? –