JOIN Problem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • JOIN Problem

    hiho,

    ich habe User und und jeder User hat Bilder. In einer Liste möchte ich jeweils den User samt drei seiner Bilder anzeigen.

    [USER]

    user_id (primary)
    user_name

    [IMAGES]
    image_id (primary)
    user_id
    image_file

    Was ich für die Ausgabe brauche ist in etwa folgendes Array:

    PHP-Code:

    $user_images 
    = array(

       
    0=> array(

          
    'user_id' => 1,
          
    'user_name' => 'Klaus',
          
    'user_images' => array(

             
    => array(

               
    'image_id' => 1,
               
    'image_file' => 'file_2.jpg'

             
    )

             
    => array(

               
    'image_id' => 2,
               
    'image_file' => 'file_2.jpg'

             
    )

             
    => array(

               
    'image_id' => 3,
               
    'image_file' => 'file_3.jpg'

             
    )

          )

       )

    ); 
    Habt ihr eine Idee? Ich denke, ich brauch noch eine dritte table?

    cheers, mil

  • #2
    Re: JOIN Problem

    Je nach MySQL-Version entweder ein SubQuery
    SELECT * FROM users a INNER JOIN images b USING (user_id) WHERE image_id IN (SELECT image_id FROM images WHERE user_id = a.user_id ORDER BY image_id ASC LIMIT 3)

    oder vielleicht doch besser einen dreifachen Join
    SELECT * FROM users a LEFT JOIN images b1, images b2, images b3 ON a.user_id = b1.user_id = b2.user_id = b3.user_id AND b1.image_id != b2.image_id != b3.image_id
    hier müssen die Bedingungen ggf. auseinander gezogen werden, ich glaub mysql mag dreifach-Vergleiche nicht

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Subquery, das wars. Toll!

      1000 Dank

      Kommentar


      • #4
        Da brauchts doch keine Subqueries (so sehr ich diese liebe), da genügt doch ein simpler INNER JOIN:
        PHP-Code:
        SELECT 
            u
        .user_id,
            
        u.user_name,
            
        i.image_id,
            
        i.image_file
        FROM
            user u
        INNER JOIN
            images i USING
        (user_id
        Oder verstehe ich wieder mal etwas falsch?
        Gruss
        H2O

        Kommentar


        • #5
          das einzige was er nicht schluckt ist das ORDER BY und LIMIT 3 in der Subquery - noch eine Idee woran das liegen mag?

          Kommentar


          • #6
            Sorry ich hab vorher die Frage zu wenig genau gelesen.
            Was ist denn die Fehlermeldung? Ich vermute, du musst in beiden SELECTS mit Aliases arbeiten.
            Gruss
            H2O

            Kommentar


            • #7
              @ h2o

              bei deiner Variante kommt das raus:

              PHP-Code:

              Array ( 

                  [
              0] => Array ( 

                      [
              user_id] => 3497286517737201 
                      
              [user_name] => hansi 
                      
              [image_id] => 3565897844471518 

                  [
              1] => Array ( 

                      [
              user_id] => 3497286517737201 
                      
              [user_name] => hansi 
                      
              [image_id] => 3281728245334148 

                  [
              2] => Array ( 

                      [
              user_id] => 3497286517737201 
                      
              [user_name] => hansi 
                      
              [image_id] => 3361986229222893 
                  
                  [
              3] => Array ( 

                      [
              user_id] => 3994614451477198 
                      
              [user_name] => Douche 1 
                      
              [image_id] => 3127445873775524 

                  [
              4] => Array ( 

                      [
              user_id] => 3994614451477198 
                      
              [user_name] => Douche 1 
                      
              [image_id] => 8282449723133157 

                  [
              5] => Array ( 

                      [
              user_id] => 3994614451477198 
                      
              [user_name] => Douche 1 
                      
              [image_id] => 1789216543446177 
                  
                  [
              6] => Array ( 

                      [
              user_id] => 3994614451477198 
                      
              [user_name] => Douche 1 
                      
              [image_id] => 7856446359579183 )

               ) 
              Jetzt brauch ich nur noch einen Tip, wie ich das nach Usern Gruppieren kann. Das Ergebnis sollte so aussehen:

              PHP-Code:

              Array ( 

                  [
              0] => Array(

                      [
              user_id] => 3497286517737201 
                      
              [user_name] => hansi
                      
              [user_images] => Array(

                          
              => Array(

                              [
              image_id] => 3565897844471518 )
                          
                          )

                          
              => Array(

                              [
              image_id] => 3565897844471518 )
                          
                          )

                          
              => Array(

                              [
              image_id] => 3565897844471518 )
                          
                          )

                      )         

                  )

                  [
              1] => Array(

                      [
              user_id] => 3497286517737201 
                      
              [user_name] => Klaus
                      
              [user_images] => Array(

                          
              => Array(

                              [
              image_id] => 3565897844471518 )
                          
                          )

                          
              => Array(

                              [
              image_id] => 3565897844471518 )
                          
                          )

                          
              => Array(

                              [
              image_id] => 3565897844471518 )
                          
                          )

                      )         

                  )


              Idee?

              Kommentar


              • #8
                Die Gruppierung wirst du in PHP vornehmen müssen, die DB liefert dir den Gruppenbruch nicht als solchen. Und die Abfrage von ghostgambler ist natürlich richtig, um die Begrenzung auf drei Bilder zu erhalten. Das Ganze könnte dann etwa so aussehen:
                PHP-Code:
                $sql "
                    SELECT 
                        u.user_id,
                        u.user_name,
                        i.image_id,
                        i.image_file
                    FROM
                        user u
                    INNER JOIN
                        images i USING(user_id)
                    WHERE
                        i.image_id IN (
                            SELECT 
                                i2.image_id 
                            FROM 
                                images i2
                            WHERE 
                                i2.user_id = i.user_id 
                            ORDER BY 
                                i2.image_id ASC 
                            LIMIT 3
                        )"
                ;        
                $res mysql_query($sql) || die(mysql_error());

                $i 0;
                $uid_alt null;
                while (
                $obj mysql_fetch_object($res)){
                    if (
                $obj->user_id != $uid_alt){                // Gruppenbruch ?
                        
                $user_images[$i]['user_id'] = $obj->user_id;
                        
                $user_images[$i]['user_name'] = $obj->user_name;
                        
                $user_images[$i]['user_images'] = array();
                        
                $uid_alt $obj->user_id;
                        
                $i ++;
                        
                $j 0;
                    }
                    
                $user_images[$i]['user_images'][$j]['image_id'] = $obj->image_id;
                    
                $user_images[$i]['user_images'][$j]['image_name'] = $obj->image_name;
                    
                $j ++;

                Gruss
                H2O

                Kommentar


                • #9
                  Funzt!

                  1000 Dank!

                  Kommentar

                  Lädt...
                  X