2010-09-30 3 views
1

J'ai deux tables, éléments et itemmeta. Les items ont un item_id qui le lie à itemmeta qui a itemmeta_id, item_id, meta_key et meta_value. Je l'ai fait donc si j'avais besoin d'ajouter un drapeau spécial ou une valeur à un élément, je n'avais pas besoin de continuer à changer la table des éléments.Comment puis-je récupérer des enregistrements d'une table et des enregistrements associés d'une autre table dans une requête?

Maintenant, je paie le prix de la flexibilité. Je veux savoir si je peux combiner une requête et un certain php dans une requête mieux conçue.

premier je fais quelque chose comme ceci:

SELECT * FROM items; 

puis en boucle à travers ceux que je le fais pour chaque en php:

$sql = "SELECT * FROM itemmeta WHERE item_id='".$item['item_id']."' "; 
$meta_result = mysql_query($sql, $conn) or die(mysql_error()); 
$item['meta'] = array(); 
while($meta=mysql_fetch_assoc($meta_result)) { 
    $item['meta'][$meta['meta_key']] = $meta['meta_value']; 
} 

Est-il possible de faire la deuxième partie en utilisant un sous-requête ou quelque chose comme ca? Je pense que la partie la plus difficile serait de garder le même résultat. ex: $ item ['meta'] ['my_key'] = 'valeur'. Je suppose que ce serait plus $ item ['meta'] [0] [0] = 'my_key' et $ item ['meta'] [0] [1] = 'valeur'.

Répondre

2

Vous souhaitez utiliser un JOIN:

SELECT i.*, im.* -- note you should really specify exactly which columns you want 
FROM items AS i 
JOIN itemmeta AS im 
    ON i.item_id = im.item_id 

Ressources:

0

select * à partir d'éléments, itemmeta où items.id = itemmeta.item_id

0
SELECT * 
FROM items it 
INNER JOIN itemmeta im 
ON it.item_id = im.item_id 
WHERE im.meta_key = 'value' 
0
$sql = "SELECT * FROM items JOIN itemmeta ON items.id = itemmeta.item_id"; 
$rs = mysql_query($sql); 
$item['meta'] = array(); 
while($row = mysql_fetch_assoc($rs)) { 
    $item['meta'][$row['meta_key']] = $row['meta_value'] 
} 

devrait fonctionner

0

Vous pouvez combiner tout cela en une seule requête, mais il ne complique votre code client. Si vous utilisez la requête suivante:

SELECT * FROM items 
LEFT JOIN itemmeta USING (item_id) 

alors le code client devrait faire une boucle à travers la vérification des changements lorsque item_id. Pour la première ligne et les lignes où l'élément a changé, vous devrez effectuer les opérations suivantes:

  1. Créer un nouvel objet élément (ou tout ce que vous utilisez pour les représenter dans votre code)
  2. Traiter les champs de la items Table
  3. Vérifiez si la même ligne a une entrée non NULL pour les itemmeta champs et traiter les cas si
  4. boucle à travers les enregistrements suivants de traitement itemmeta champs jusqu'à ce qu'il ya un nouvel élément
0

En plus des réponses spécifiques données ci-dessus, je suggère un bon livre d'introduction sur SQL. Si vous êtes en train de découvrir les jointures, il y a beaucoup d'autres éléments importants de SQL que vous devriez apprendre. Vous venez de gratter la surface.

J'ai toujours aimé SQL For Dummies d'Allen Taylor.En dépit d'être un livre de Dummies, c'est une bonne introduction à ces concepts si importants pour SQL que vous trouverez.

Questions connexes