2016-04-05 4 views
1

Ich möchte Benutzer aus einer Tabelle auswählen, und in der anderen nach id suchen, indem Sie LIMIT 5 für jeden festlegen.MySQL: Wie bekomme ich fünf Beiträge von jedem Benutzer?

Hier ist, was ich habe, aber ich kann nicht wiederverwendet werden, die a.id in der 2. Vereinigung

SELECT a.id AS USER, 
     p.id AS post_id 
FROM (
     (SELECT a.id 
     FROM `user` a 
     WHERE a.date=...) 
     UNION 
     (SELECT p.id 
     FROM `post` p 
     WHERE p.user_id=a.id LIMIT 5)`` `) AS post 

Danke, aloha

+1

Normalerweise würden Sie, wenn Sie auf Werte in einer Tabelle aussehen wollen und sehen, ob sie in einem anderen existieren Beitreten. Kannst du erklären, was du erreichen willst? Vielleicht geben Sie Beispiele für Ihre Quelldaten und wie die Ausgabe aussehen soll. – Jared

+0

Ich möchte nur 5 Beiträge von jedem Benutzer erhalten –

Antwort

1

Die Abfrage wie folgt aussehen könnte:

Haupt Abfrage:

SELECT 
t.userID, 
t.postID 
FROM 
(
     SELECT 
      user.id AS userID, 
      post.id AS postID, 
      IF (@prev = post.user_id ,@cn := @cn + 1 ,@cn := 0) SL, 
      @prev := post.user_id 
     FROM (SELECT @cn := 0, @prev := 0) var,post 
     INNER JOIN user ON user.id = post.user_id 
     ORDER BY post.user_id) t 
WHERE t.SL < 5; 

Die Abfrage wird 5 Beiträge für jeden Benutzer auswählen.


TEST:

Kann keine SQL FIDDLE hinzuzufügen.

Also hier sind einige Testdaten mit Schema, um die Abfrage zu überprüfen.

DROP TABLE IF EXISTS `post`; 
CREATE TABLE `post` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

INSERT INTO `post` VALUES ('1', '71'); 
INSERT INTO `post` VALUES ('2', '66'); 
INSERT INTO `post` VALUES ('3', '66'); 
INSERT INTO `post` VALUES ('4', '71'); 
INSERT INTO `post` VALUES ('5', '66'); 
INSERT INTO `post` VALUES ('6', '71'); 
INSERT INTO `post` VALUES ('7', '71'); 
INSERT INTO `post` VALUES ('8', '71'); 
INSERT INTO `post` VALUES ('9', '66'); 
INSERT INTO `post` VALUES ('10', '66'); 
INSERT INTO `post` VALUES ('11', '66'); 
INSERT INTO `post` VALUES ('12', '66'); 
INSERT INTO `post` VALUES ('13', '71'); 
INSERT INTO `post` VALUES ('14', '91'); 

DROP TABLE IF EXISTS `user`; 
CREATE TABLE `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
); 
INSERT INTO `user` VALUES ('66'); 
INSERT INTO `user` VALUES ('71'); 
INSERT INTO `user` VALUES ('91'); 


SELECT 
* 
FROM post; 

Ergebnis:

id user_id 
1 71 
2 66 
3 66 
4 71 
5 66 
6 71 
7 71 
8 71 
9 66 
10 66 
11 66 
12 66 
13 71 
14 91 

SELECT * FROM user;

Ergebnis:

id 
66 
71 
91 

Beiträge insgesamt pro Benutzerabfrage:

012.351.
SELECT 
user_id, 
COUNT(*) totalPost 
FROM post 
GROUP BY user_id; 

Ergebnis:

user_id totalPost 
66   7 
71   6 
91   1 

Endergebnis:

userID postID 
66  2 
66  3 
66  5 
66  12 
66  11 
71  1 
71  13 
71  8 
71  7 
71  6 
91  14 
+0

Kann ich 'WHERE t.SL <5' zwischen (..) t? Weil ich dazu noch eine weitere Tabelle zusammenfügen muss ... –

+0

Kein Kumpel! Sie müssen diese Ergebnismenge verwenden, wenn Sie eine Union mit einer anderen Tabelle erstellen möchten. Stellen Sie nur sicher, dass dies für Sie funktioniert. – 1000111

+0

Also muss ich 'WO t.SL <5' am Ende meiner Auswahl haben, egal wie viele Gewerkschaften ich habe? –