2017-06-21 4 views
0

Cant scheinen, um herauszufinden, wie die neuesten Artikel von Benutzer geschrieben zu bekommen, und die Gesamtzahl der Artikel von diesem Nutzer ..Mysql erhalten neuesten Artikel nach Benutzer und Gesamtzahl der Artikel?

Hier ist, was ich versucht habe:

SELECT users.id, users.username, users.role, COUNT(articles.id) AS 
     total_articles, (SELECT articles.title 
     FROM articles ORDER BY id DESC LIMIT 1) AS latest_article_title 
FROM users 
JOIN articles ON users.id = articles.author_id 

ich folgendes haben Tabellen:

Ich lerne gerade MYSQL, also jede mögliche Hilfe mit diesem würde gut geschätzt werden!

Edit: Deine Antworten zu lesen, und wollte meine eigene Abfrage tun, dass ich mich zu verstehen und schreiben, so kam ich mit auf den Punkt:

SELECT users.username, COUNT(articles.id) AS total_articles, 
     (SELECT articles.title FROM articles WHERE articles.author_id = users.id 
      ORDER BY articles.id DESC LIMIT 1) as latest_article_title 
FROM users 
LEFT JOIN articles ON users.id = articles.author_id 
GROUP BY articles.author_id 

Ist das in Ordnung? Ich meine, es funktioniert und gibt mir genau die Ergebnisse, die ich brauche. Aber, ist "geschachtelt" auswählen, innerhalb von auswählen, okay zu verwenden?

+0

Plz zeigen die Tabellenstruktur und Ihre erwartete Ausgabe – Shibon

+0

Select Sub-Abfrage ist keine gute Praxis. Es nimmt zu viel Zeit –

Antwort

1

Sie könnten versuchen, aktuelle Artikelnummer und Anzahl der Artikel zu erhalten, die durch die Nutzung dieser Abfrage

SELECT articles.author_id, 
         Count(articles.id) AS total_articles, 
         Max(id)   latest_article_id 
        FROM articles 
        GROUP BY articles.author_id 

Dann durch Benutzer geschrieben, verbinden sie diese Daten mit Benutzer und Artikel Tabelle erwartete Ergebnis erhalten

SELECT u.id, 
     u.username, 
     u.role, 
     a.total_articles, 
     b.title AS latest_article_title 
FROM users u 
     LEFT JOIN (SELECT articles.author_id, 
         Count(articles.id) AS total_articles, 
         Max(id)   latest_article_id 
        FROM articles 
        GROUP BY articles.author_id) a 
       ON u.id = a.author_id 
     LEFT JOIN articles b ON a.latest_article_id = b.id 
+0

Heyo .. Vielen Dank für die Antwort. Kannst du meine Bearbeitung oben ansehen? Ist es in Ordnung, wenn ich SELECT innerhalb von SELECT neste? Wäre diese Abfrage in Ordnung? Wollte meine eigene Abfrage schreiben, um zu sehen, ob ich könnte, und es funktioniert .. Cheers! – bawsi

+0

Hallo @miqro, ich habe deine Bearbeitung aussieht. Die verschachtelten Auswahlvorgänge verlangsamen Ihre Abfrage. Für kleine Datenmengen ist es in Ordnung. Aber für eine große Menge an Daten hat es eine sehr schlechte Leistung. Für eine bessere Leistung sollten Sie JOIN verwenden. –

+0

Aber Sie auch SELECT innerhalb SELECT in obigem Beispiel verwendet? "LEFT JOIN (SELECT articles.author_id, ...", ist das anders? – bawsi

1

Ich weiß nicht, Ihre genaue Strukturtabelle so hat ein Fehler in der Abfrage sein könnte, aber ich würde so etwas wie dies versucht:

Select user.id, user.username, users.role, COUNT(articles.id) as total_articles, 
     (Select articles.title 
     from articles 
     Where author_id=user.id 
     order by articles.created_at desc Limit 1) as latest_article_title 
from users 
join articles ON user.id = articles.author_id 
1

Versuchen Sie, diese

SELECT t.*,COUNT(articles.id) AS total_articles 
FROM 
(
    SELECT a.title,a.id AS article_id,a.`author_id`,users.id AS user_id, 
      users.username, users.role 
    FROM articles AS a 
    INNER JOIN users ON a.author_id = users.id 
    ORDER BY a.id DESC LIMIT 1 
) t 
INNER JOIN articles ON articles.`author_id` = t.author_id 

Hoffen, es löst Ihr Problem

1

Sie können unter sqls versuchen. Ich habe alle Schritte implementiert, um die endgültige Antwort zu erhalten.

Tabellen

Benutzer

id username password role 
1 mamta  123456 admin 
2 hema   124378 user 

Artikel

title body   created_at author_id 
Poem This is a poem 2017-06-01  1 
Story This is a Story 2017-06-20  1 
Song This is a Song 2017-06-10  2 
Sangeet This is a Sangeet 2017-06-08 1 
Rhyme This is a Rhyme 2017-06-16  2 

Schritt 1

SELECT MAX(created_at) AS created_at, COUNT(author_id) AS Total 
FROM `articles` 
GROUP BY author_id 

Ausgabe

012.351.
created_at Total 
2017-06-20 3 
2017-06-16 2 

Schritt 2

SELECT ar1.*,ar2.total FROM articles ar1 
INNER JOIN (
    SELECT MAX(created_at) AS created_at, COUNT(author_id) AS total 
FROM `articles` 
GROUP BY author_id 
) ar2 
ON ar1.created_at = ar2.created_at 

Output

title body    created_at author_id total 
Story This is a Story 2017-06-20 1   3 
Rhyme This is a Rhyme 2017-06-16 2   2 

Schritt 3 (Final Sql)

SELECT u.id,u.username,u.role,ar.title ,ar.total AS total , ar.created_at FROM user u 
INNER JOIN 
(
SELECT ar1.*,ar2.total FROM articles ar1 
INNER JOIN (
    SELECT MAX(created_at) AS created_at, COUNT(author_id) AS total 
FROM `articles` 
GROUP BY author_id 
) ar2 
ON ar1.created_at = ar2.created_at 
) ar ON ar.author_id = u.id 

Output

id username role title total created_at 
1 mamta  admin Story 3  2017-06-20 
2 hema  user  Rhyme 2  2017-06-16 
+0

Heyo .. Danke für die Antwort ausgeführt werden. Kannst du meine Bearbeitung oben ansehen? Ist es in Ordnung, wenn ich SELECT innerhalb von SELECT neste? Wäre diese Abfrage in Ordnung? Wollte meine eigene Abfrage schreiben, um zu sehen, ob ich könnte, und es funktioniert .. Cheers! – bawsi

Verwandte Themen