2010-11-22 6 views
0

i ont une table nommée IMAGES dans lequel il est l'attribut nom img_ID qui est la clé primaire,seule requête SQL pour récupérer les résultats des tables avec des relations Beaucoup Many

il y a une autre table appelée Favoris dans lequel il y a deux attributs de la img_ID '& user_ID ... img_ID sert de clé étrangère à une image et user_ID sert clé étrangère à l'utilisateur

maintenant j'ai besoin de détails de partir IMAGES de tous les img_ID s de Favorisuser_ID une certaine valeur x

ce que je pouvais le faire comme, d'ailleurs je suis en utilisant PHP & mySQL

$gett = mysql_query("SELECT img_ID FROM favorites WHERE user_ID='".$variable."'"); 

if(mysql_num_rows($gett) > 0) 
{ 
    while($steps = mysql_fetch_assoc($gett)) 
    { 
    $res = mysql_query("SELECT * FROM images WHERE img_ID='".$steps['img_ID']."' ORDER BY img_Date"); 

     if(mysql_num_rows($res) > 0) 
     { 
      while($result= mysql_fetch_assoc($res)) 
      { 
       echo $result['img_Name']; 
       echo $result['img_Desc']; 
       echo $result['img_ext']; 
      } 
     else 
      echo "no images were found"; 
    } 
} 
else 
    echo "no favorites were found"; 

CODE PSEUDO sera comme

RUN QUERY 
for each img_ID where user_ID is this 
    RUN QUERY  
    for each img_ID 
     perform DISPLAY 

Cette méthode a une faille & un dos-draw

DÉFAUT             = l'ordre qui est à l'horodatage est détruit

arrière-draw = il y a une requête en boucle imbriquée.

QUESTION: Est-ce que tout cela peut être fait avec une requête? si oui alors comment?

Répondre

2

Utilisez une jointure:

select 
    i.* 
from 
    favorites f 
    join images i on f.img_id = i.img_id 
where 
    f.user_id = <user id> 

Aussi, modifiez votre code pour utiliser mysqli et instructions préparées avec des variables liées à la fois d'améliorer les performances et éliminer la menace des attaques par injection SQL.

+0

Votre requête a quelques erreurs et je suggère PDO sur mysqli. Tous les principaux ORM PHP sont construits dessus pour une bonne raison. –

+0

est que la syntaxe EXACT ou il ya quelque chose que je dois mettre à la place de i & f – Moon

+0

@Dan Grossman - "quelques erreurs" = "une faute de frappe d'une lettre". Mais merci, corrigé. Et je ne fais pas beaucoup de PHP, donc je m'en remettrai à vous sur PDO, mais l'un ou l'autre serait mieux que droit 'mysql_query' – Donnie

0
SELECT i.* -- possibly would need to be "SELECT DISTINCT i.*" instead 
FROM images AS i 
    INNER JOIN favorites AS f 
     ON f.img_ID = i.img_ID 
WHERE f.user_ID = ??? 
+0

DISTINCT ne sert à rien car dans la table des favoris, le tuple img_ID & user_ID sert de clé primaire – Moon

0

Aucune boucle, interrogez simplement les deux tables.

SELECT 
    images.* 
FROM 
    images 
INNER JOIN 
    favorites 
ON 
    favorites.img_ID = images.img_ID 
WHERE 
    favorites.user_ID = X 
Questions connexes