2012-08-27 3 views
2

Je dois sortir certains produits de la table 'products', ainsi que le prix le plus bas de la table 'product_licenses', qui est la seule colonne dont j'ai besoin dans cette requête.Utiliser la fonction sql min() dans la boucle php

Cependant, lorsque j'essaie d'utiliser la fonction sql MIN(), ma boucle ne parcourt qu'une seule fois le code et obtient le premier résultat, puis s'arrête, donc je suis un peu perdu ici.

C'est la requête en utilisant min():

$mysql->query(" 
    SELECT pd.*, min(lc.price) AS price 
    FROM `products` AS pd, product_licenses AS lc 
    WHERE pd.`status` = '1' AND lc.product_id = pd.id 
    ORDER BY pd.`id` ASC 
    $limitQuery 
"); 

J'utilise cette fonction pour obtenir les produits, mais, malheureusement, va chercher le prix le plus élevé:

public function getAllProducts($start = 0, $limit = 0, $order = '`datetime` ASC') { 
    global $mysql; 


    $limitQuery = ''; 
    if ($limit != 0) { 
     $limitQuery = " LIMIT $start,$limit "; 
    } 
    **// Not working if I use min() on lc.price** 
    $mysql->query(" 
     SELECT pd.*, lc.price 
     FROM `products` AS pd, product_licenses AS lc 
     WHERE pd.`status` = '1' AND lc.product_id = pd.id 
     ORDER BY pd.`id` ASC 
     $limitQuery 
    "); 

    if ($mysql->num_rows() == 0) { 
     return false; 
    } 

    $this->usersWhere = ''; 
    $return = array(); 
    while ($d = $mysql->fetch_array()) { 
     $categories = explode(',', $d['category_id']); 
     unset($d['category_id']); 
     foreach ($categories as $c) { 
      $c = trim($c); 
      if ($c != '') { 
       $d['category_id'][$c] = $c; 
      } 
     } 

     $return[$d['id']] = $d; 
    } 

    $this->foundRows = $mysql->getFoundRows(); 

return $return; 
} 
+0

Combien de lignes sont renvoyées lorsque vous supprimez 'min()'? – Matt

+0

Vous devez déboguer votre requête dans votre base de données avant de poster une question ici – Alfwed

+0

Votre requête donne-t-elle un résultat exact? –

Répondre

4

Ajoutez GROUP BY à votre requête. votre requête actuelle renvoie un seul résultat puisque vous utilisez la fonction d'agrégat (MIN) mais pas le regrouper.

SELECT pd.col1, 
     pd.col2, min(lc.price) AS PRICE 
FROM `products` AS pd 
      INNER JOIN product_licenses AS lc 
        ON lc.product_id = pd.id 
WHERE pd.`status` = '1' 
GROUP BY pd.col1, pd.col2, pd.col3 
ORDER BY pd.`id` ASC 
$limitQuery 

PS: afficher la structure de votre base de données avec des enregistrements. La communauté comprendra clairement votre question :)

+0

Si ce n'était pas posté dans la même minute, j'aurais pu jurer que nos requêtes étaient * identiques *. +1 :) – Fluffeh

+0

'+ 1' de toute façon, je n'ai pas voté pour votre réponse. : D –

+0

Tu n'étais pas obligé de le faire, toutes les réponses étaient justes, j'ai upvoted le tien et celui d'Eric car ils étaient corrects. Je pensais juste que c'était hilarant que nous ayons tous les trois fait trois cols à partir de pd et que les deux utilisent des commandes en minuscules telles que 'group by' en tapant. Aimez votre travail et admirez vos réponses, vous en avez de fantastiques! (Essayant de dire que je n'étais pas un abruti, juste que tu m'as bien fait rire) – Fluffeh

4

Vous avez pas de clause group by dans votre requête, de sorte que la requête renvoie uniquement la première ligne.

SELECT pd.col1, pd.col2, pd.col3, min(lc.price) AS price 
FROM `products` AS pd, product_licenses AS lc 
WHERE pd.`status` = '1' AND lc.product_id = pd.id 
group by pd.col1, pd.col2, pd.col3 
ORDER BY pd.`id` ASC 
$limitQuery 
4

Vous aurez besoin d'un GROUP BY là-dedans, comme ceci:

SELECT pd.*, min(lc.price) AS price 
FROM `products` AS pd, product_licenses AS lc 
WHERE pd.`status` = '1' AND lc.product_id = pd.id 
GROUP BY pd.`id` 
ORDER BY pd.`id` ASC 
$limitQuery 

Notez que MySQL, il vous suffit de groupe par la colonne id, même si vous choisissez d'autres colonnes des produits table.

+0

Merci beaucoup. Ça devenait vraiment frustrant à ce sujet, mais maintenant tout va bien :-) –

Questions connexes