2012-03-28 6 views
0

Ich habe eine Tabelle, die Artikel von Benutzern veröffentlicht enthält. Die Struktur der Tabelle ist wie folgt:Wie kann ich den Artikel eines bestimmten Benutzers entsprechend der Anzahl der Ansichten dieses Artikels anzeigen?

id  uid  author  article_name  article  num_views  edit_time 

id der Artikel-ID ist, uid ist der Autor-ID und num_views ist, wie oft dieser Artikel betrachtet wird.

Was ich brauche, ist nur die aufgerufene Artikel angezeigt werden nach uid

Kurz gesagt, wenn uid ist author id und article id ist 5, was ich brauche, ist wie etwas angezeigt werden :

id  uid  article_name  num_views 
5  1  article title  100 

Ich habe versucht, mehrere zu laufen Abfragen in Mysql, aber ich konnte es nicht herausfinden, kann jemand bitte helfen ??

+1

probiere 'SELECT ID, uid, article_name, num_views FROM Artikel ORDER BY num_views DESC LIMIT 1' – Yaniro

+2

sollte nicht die' uid' in deinem Beispiel 2 sein? –

+0

ELECT id, uid, article_name, NUM_VIEWS FROM Artikel WHERE 'uid' = '1' ORDER BY NUM_VIEWS DESC LIMIT 1, diesmal nur das getan, was ich brauche, danke viel :) – wfareed

Antwort

2

Der aufgerufene Artikel und seine Zählung von jedem Benutzer:

SELECT `id`, `uid`, `article_name`, `num_views` 
FROM `table` 
WHERE `num_views` IN ( 
    SELECT MAX(`num_views`) FROM table GROUP BY `uid`) 

Nur gegeben uid

SELECT `id`, `article_name`, MAX(`num_views`) 
FROM `table` 
WHERE `uid` = <user id> 
+1

Es gibt keine Garantie, dass' 'id' und article_name' wird die Zeile mit max (num_views) dort übereinstimmen. – KernelM

+0

Diese Abfrage gibt die falsche ID (Artikel-ID) zurück und es wird nicht nach einer bestimmten Benutzer-ID ausgewählt. – wfareed

+0

@wfareed brauchen Sie nur für eine UID? – safarov

1

Wenn Sie nur einen Eintrag benötigen, sollten Sie versuchen, Ihre Abfrage BY-Befehl mit Reihenfolge zu sortieren und beschränken Sie es auf den einen Artikel mit dem Befehl LIMIT 1.

SELECT * FROM ARTIKEL WHERE (einige Kriterien) ORDER BY NUM_VIEWS DESC LIMIT 1

, dass ein Artikel mit den meisten Ansichten wählen soll.

1

Es ist ein bisschen hacky und wenn die Tabelle groß wird, es wird nicht performant sein, aber ein Weg, dies zu tun wäre:

select uid, 
group_concat(id order by num_views desc) as most_viewed_id, 
group_concat(article_name order by num_views desc) as most_viewed_name, 
group_concat(num_views order by num_views desc) as num_views 
from yourtable group by uid 

Sie werden dann das erste Element analysieren, müssen aus jedes der group_concat'd-Felder.

würde Eine andere Möglichkeit, eine Verknüpfung mit einer Unterabfrage zu verwenden, aber es kann komisch sein, wenn es mit der gleichen höchsten Anzahl von Ansichten für den gleichen Benutzer zwei Artikel ist, und hat auch Performance-Probleme:

select uid,num_views,id,article,article_name from 
yourtable join 
(select uid,max(num_views) as maxviews from yourtable group by uid) as subtable 
using (uid,num_views) 

Natürlich wäre der beste Weg zu einem bestimmten Zeitpunkt, einfach über Uids mit einer einfachen Abfrage-Reihenfolge zu iterieren. Es ist viel mehr Abfragen, aber es kann schneller sein, abhängig von Ihren Daten. Leider ist SQL einfach nicht wirklich eingerichtet, um solche Anfragen zu stellen.

+0

Danke trotzdem :) – wfareed

Verwandte Themen