MySQL: Select mit MAX() von sub-query mit COUNT()
Bevor Sie Kennzeichnen diese als Duplikat bitte werfen Sie einen Blick auf diese SQLFiddle.
Habe ich dieses schema:
CREATE TABLE book(book_id int,
book_name varchar(100),
author_id int,
editor_id varchar(100),
isbn varchar(100));
INSERT INTO book
VALUES
(1 , 'Book1 Title' , 12 , 'Editor1' , '8000-9000' ),
(2 , 'Book2 Title' , 98 , 'Editor1' , '8000-9001' ),
(1 , 'Book1 Title' , 12 , 'Editor1' , '8000-9002' ),
(3 , 'Book3 Title' , 3 , 'Editor1' , '8000-9003' );
CREATE TABLE author(author_id int,
fn varchar(100),
ln varchar(100));
INSERT INTO author
VALUES
(12, 'name1','lname1'),
(98,'name2','lname2'),
(3,'name3','lname3');
Den sub-Abfrage:
SELECT c.author_id,COUNT(*) book_count FROM book c
GROUP BY c.author_id
hat ein Ergebnis:
| AUTHOR_ID | BOOK_COUNT |
--------------------------
| 3 | 1 |
| 12 | 2 |
| 98 | 1 |
Nun, der schwierige Teil hier ist das Ergebnis dieser Abfrage:
SELECT MAX(book_count),a.* FROM
author a,(
SELECT c.author_id,COUNT(*) book_count FROM book c
GROUP BY c.author_id
) b
where a.author_id = b.author_id
ist diese:
| MAX(BOOK_COUNT) | AUTHOR_ID | FN | LN |
------------------------------------------------
| 2 | 3 | name3 | lname3 |
sollte wie folgt sein:
| MAX(BOOK_COUNT) | AUTHOR_ID | FN | LN |
------------------------------------------------
| 2 | 12 | name1 | lname1 |
Was denken Sie ist falsch bei der Abfrage?
Wie bekommen Sie
In
FN
und LN
in Ihrem Ergebnis ohne Auswahl?In
a.*
.InformationsquelleAutor Christian Mark | 2013-08-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statt
MAX()
können Sie einfachLIMIT
für die gleichen. Auch die VerwendungJOIN
statt.Ausgabe:
Sehen diese SQLFiddle
Edit:
Wenn Sie verwenden möchten
MAX()
für die Nutzung von sub-Abfrage wie diese:Sehen diese SQLFiddle
Edit2:
Anstatt
LIMIT
in der äußeren Abfrage können Sie einfach verwenden Sie es in der inneren Abfrage:Sehen diese SQLFiddle
LIMIT
? Was ist falsch mitMAX()
?Denn wenn Sie
MAX()
oder jede Aggregatfunktion verwenden SieGROUP BY
- Klausel. Warten Sie nur Bearbeiten, wenn Sie verwenden möchtenMAX()
.Diese arbeiten würde, aber die follow-up-Frage steht immer noch.
Ja, siehe mein edit jetzt.
Aber immer noch das gleiche Ergebnis? Ich würde lieber das erste, da sieht es einfach besser aus. Danke. Akzeptierte Antwort.
InformationsquelleAutor hims056
In der Tat, MySQL hat eine mangelnde Unterstützung der SQL-standard, denn Sie ermöglicht den Einsatz von Aggregatfunktionen ohne GROUP BY-Klausel und gibt zufällige Daten im Ergebnis. Sie sollten vermeiden, die Verwendung von Aggregaten.
BEARBEITEN:
Ich meine, zum Beispiel in MySQL können Sie die Abfrage ausführen, wie diese:
Liefert zufällige Daten in Spalte c, und das ist furchtbar falsch.
author_id
das Ergebnis wäre das gleiche wie die sub-Abfrage.Sorry, ich meine, es dauert max und die erste Zeile von " a " - Tabelle.
So was empfehlen? Du hast Antwort auf meine follow-up Frage, aber nicht die Frage. +1 obwohl. Ich kann nicht akzeptieren dies ohne das Recht fix.
Welche Aufgabe sind Sie die Lösung? Wollen Sie, um zu zeigen, Informationen über den Autor mit den meisten Büchern?
Nein, ich möchte die Anzeige der Autor mit der Anzahl der Bücher. Aber ich akzeptierte Antwort. Danke für die Mühe.
InformationsquelleAutor Mikhail Aksenov
Diese wundere mich, diese Abfrage ausgeführt wird, verwendet Sie die Aggregat-Funktion mit der mit der Gruppe durch. Wenn Sie brauchen, um die Identität der Benutzer die maximale nook zählen
Bitte versuchen Sie
Lassen Sie mich wissen, wenn es funktioniert.
InformationsquelleAutor Ashutosh Arya