2016-11-29 3 views
3

Ich renne in ein Problem, das ich nicht herausfinden kann. Ich mache eine SELECT-Abfrage, um die Freunde der Benutzer anzuzeigen. Ich schließe mich einer Tabelle für Benutzer, Freunde und profile_img an, um die Benutzerinformationen, ihr Profilbild und die Freundschaftsbeziehung abzurufen.Query-Ausgabe nicht konsistent zu If-Bedingung

In der Freundes-Tabelle, wenn friend_one und friend_two eine status von 2 haben, bedeutet das, dass sie Freunde sind. Dies ist, was meine Abfrage sucht und dann die anderen Tabellen zusammenfügt, um die anderen Daten wie den Benutzernamen und das Bild abzurufen.

Die Abfrage scheint gut zu funktionieren. Mein Output ist jedoch nicht das, was es sein sollte.

In meiner Freundes-Tabelle, wenn Sie Zeile 2 betrachten (siehe INSERT unten), ist friend_one 5 und friend_two ist 1. Meine Abfrage erhält die Daten für diese beiden Benutzer jedoch, wenn ich versuche, den Freund auszugeben Liste, ich möchte nur die Freundesliste anzeigen, die mit dem Benutzerprofil verknüpft ist, das ich gerade betrachte. Also, wenn ich auf Freund 1 der Profilseite, die Daten, die ich zeigen möchte, ist nur für Freund 5.

CREATE TABLE `friends` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`friend_one` int(11) NOT NULL DEFAULT '0', 
`friend_two` int(11) NOT NULL DEFAULT '0', 
`status` enum('0','1','2') COLLATE utf8_unicode_ci DEFAULT '0', 
`date` datetime NOT NULL, 
PRIMARY KEY (`id`), 
KEY `friend_two` (`friend_two`) 
); 

INSERT INTO `friends` 
VALUES 
(1, 1, 2, 2, NOW()), 
(2, 5, 1, 2, NOW()) 
; 

ich ein versuchter if-Anweisung vorbei an den Freund Daten fortzusetzen entspricht, in der die Seite Profil Benutzer Ich war auf und es funktioniert für die friend_1 Ausgabe ... die würde 1 zeigen, aber es tut es nicht für die friend_img und friend_username.

Kann jemand sehen, warum es für $friend_1 arbeitet, aber nicht den Rest ihrer Daten? Das Bild und der Benutzername geben die Daten des Profilbenutzers aus, wobei es das Gegenteil und nur die Daten ihrer Freunde sein sollten.

$friend_status = 2; 
    $friend_sql = " 
    SELECT f.*, 
     u1.*, 
     u2.*, 
     p1.*, 
     p2.*, 
     IFNULL(p1.img, 'profile_images/default.jpg') AS img1, 
     IFNULL(p2.img, 'profile_images/default.jpg') AS img2 
    FROM friends f 
    LEFT JOIN users u1 ON u1.id = f.friend_one 
    LEFT JOIN users u2 ON u2.id = f.friend_two 
    LEFT JOIN (
     SELECT user_id, max(id) as mid 
     FROM profile_img 
     GROUP BY user_id 
    ) max1 ON u1.id = max1.user_id 
    LEFT JOIN (
     SELECT user_id, max(id) as mid 
     FROM profile_img 
     GROUP BY user_id 
    ) max2 ON u2.id = max2.user_id 
    LEFT JOIN profile_img p1 ON p1.user_id = f.friend_one and p1.id = max1.mid 
    LEFT JOIN profile_img p2 ON p2.user_id = f.friend_two and p2.id = max2.mid 
    WHERE (friend_one = :profile_user or friend_two = :profile_user) 
      AND status = :total_status 
    "; 
    $friend_stmt = $con->prepare($friend_sql); 
    $friend_stmt->execute(array(':profile_user' => $profile_user, ':total_status' => $friend_status)); 
    $friend_total_rows = $friend_stmt->fetchAll(PDO::FETCH_ASSOC); 
    $count_total_friend = $friend_stmt->rowCount(); 
?> 
      <div id="friend-list-container"> 
       <div id="friend-list-count">Friends <span class="light-gray"><?php echo $count_total_friend; ?></span></div> 
       <div id="friend-list-image-container"> 
<?php 
    foreach ($friend_total_rows as $friend_total_row) { 
     $friend_1   = $friend_total_row['friend_one']; 
     $friend_2   = $friend_total_row['friend_two']; 
     $friend_img_src  = $friend_total_row['img']; 
     $friend_img   = '<img src="'.$friend_img_src.'" alt="Friend Image">'; 
     $friend_username = $friend_total_row['username']; 
     if($friend_1 !== $profile_user) { 
      echo '<div class="friend-list-block"> 
        <div class="friend-list-block-img">' . 
        $friend_img . 
         '<div class="friend-list-block-details">'. $friend_1 . " " 
        . $friend_username . 
       '</div></div></div>'; 

     } 

Fiddle

+0

Ich bin mir nicht sicher, was genau Sie fragen? Auf meiner Seite (friend_1) alle Daten von meinen Freunden anzeigen (friend_2, 3 etc)? – boroboris

+0

Wenn ich auf einer Benutzerseite mit einer ID von 1 bin (siehe mein Beispiel oben), sollte die einzige Ausgabe von Benutzer 5 sein. Meine Ausgabe auf meiner Seite zeigt Benutzer 5 als '$ friend_one', aber den Benutzernamen und img ist von Benutzer 1. – Paul

Antwort

1

Wenn ich Ihre Anfrage richtig verstanden habe, ich glaube, Sie suchen:

SELECT u.*, p.img 
FROM users u 
LEFT JOIN (
     SELECT user_id, max(id) as mid 
     FROM profile_img 
     GROUP BY user_id 
    ) mid ON u.id = mid.user_id 
LEFT JOIN profile_img p ON p.id = mid.mid 
WHERE u.id in (
    SELECT friend_one FROM friends WHERE friend_two = 1 AND status = 2 
    UNION 
    SELECT friend_two FROM friends WHERE friend_one = 1 AND status = 2 
    ); 

OK, also hier ist ein Update für den PHP-Teil ...

<?php 
    foreach ($friend_total_rows as $friend_total_row) { 
     $friend_id   = $friend_total_row['id']; 
     $friend_img_src  = $friend_total_row['img']; 
     $friend_img   = (!empty($friend_img_src)) ? '<img src="'.$friend_img_src.'" alt="Friend Image">' : ''; 
     $friend_username = $friend_total_row['username']; 
      echo '<div class="friend-list-block"> 
        <div class="friend-list-block-img">' . 
        $friend_img . 
         '<div class="friend-list-block-details">'. $friend_id . " " 
        . $friend_username . 
       '</div></div></div>'; 

    } 
+0

Meine Abfrage ist in Ordnung, die Ausgabe ist falsch ... Ich denke, das Problem stammt aus meiner if-Bedingung. – Paul

+0

Nein, Ihre Abfrage versucht aufgrund ihrer Struktur zu viele Informationen zu erfassen. Geh zurück zu deiner Geige und sieh dir die doppelten Spalten an, die zurückgegeben werden. PHP wird das letzte mit dem Label "img" auswählen. Alle U1. *, U2. *, P1. *, P2. * Packt Duplikate der Felder. Vereinfachen Sie die Abfrage, um nur das zu erhalten, was Sie benötigen. Durch das Reduzieren all dieser JOINs wird die Abfrage beschleunigt. –

+0

Hmm. Nun, deine Frage hilft in gewisser Weise, aber tut auch weh. Es erhält jetzt die richtigen Benutzerinformationen, aber ich brauchte die maximale ID darin, um nur das neueste profile_img zu erhalten. – Paul

Verwandte Themen