2010-01-27 2 views
1

J'ai la requête MySQL suivante:requête MySQL fonctionne dans phpmyadmin, mais aucune ligne retourné en résultat PHP mis

SELECT SQL_CALC_FOUND_ROWS p.* 
FROM product AS p 
LEFT JOIN productCategory AS c ON FIND_IN_SET(c.id, REPLACE(TRIM(p.categories), ' ',',')) 
WHERE (
    c.id IS NULL 
    OR c.status = 'D' 
    OR p.categories IS NULL 
    OR TRIM(p.categories) = '' 
) 
AND p.deprecated = 'N' 
LIMIT 0,30 

Cette requête est de ramasser des produits qui:

  • a quelque chose mis à p.categories colonne, mais la ligne sur la table productCategory n'existe pas
  • Avoir une productCategory ligne, mais l'état de la ligne productCategory est réglé sur « D »
  • Qu'il n'y ait rien défini dans le p.categories colonne

p.categories est une ligne avec un espace séparé des valeurs numériques représentant ids sur la table productCategory. Pas le meilleur design, accordé mais on m'a confié cette tâche, alors j'ai besoin d'un moyen de le faire.

Dans le code PHP, cette requête est exécutée directement après:

SELECT FOUND_ROWS() as count 

Lorsqu'il est exécuté à partir phpmyadmin, je reçois des milliers de lignes retournées et quand je joins la deuxième requête, je reçois une valeur de comptage correct Nombre de rangées. Lorsque j'exécute la même première requête via mysqli_query(), je n'ai aucune ligne renvoyée et la requête suivante renvoie un nombre de 1.

Les deux phpmyadmin et mon code PHP se connectent à la même base de données.

Quelqu'un peut-il voir ce qui ne va pas ?!

Mise à jour:

Je ne veux que les 30 premières lignes retournées parce qu'il pourrait y avoir un grand nombre, dans la requête suivante, je devrais obtenir un compte de ce que total serait, SQL_CALC_FOUND_ROWS donc après la premier SELECT.

+0

Essayez d'ajouter un point-virgule après chaque instruction. –

+0

Lors de l'exécution de la requête via PHP, chacun est passé par mysqli_query() séparément, donc pas besoin. Dans phpmyadmin, oui, je les sépare avec un point-virgule. – berty

+0

Sidenote: vous ne stockez pas les catégories de manière efficace, de cette façon, le moteur DB doit faire une fonction de remplacement de chaîne sur ** TOUS ** les lignes de produits. Vous devriez avoir une autre table qui stocke les relations 'post_id => category_id' ... –

Répondre

0

Pour une raison quelconque, en changeant la première ligne de la requête:

SELECT SQL_CALC_FOUND_ROWS p.* 

Pour:

SELECT SQL_CALC_FOUND_ROWS p.id 

Et puis en boucle à travers les résultats obtenir les données que je nécessaire de chaque rangée dans des requêtes séparées a obtenu le résultat que j'étais après.

1

Vous devez effectuer la première requête uniquement pour obtenir le jeu de consignation renvoyé à PHP. Vous pouvez compter dans votre PHP une fois que vous l'avez. Vous ne devez pas passer des requêtes concaténées de PHP à MySQL.

-à-dire

$result = mysql_query($query); 
$recordCount = mysql_num_rows($result); 
+0

Cela inclurait toutes les lignes dans le résultat, je veux seulement les 30 premiers au départ car il pourrait y avoir un nombre énorme, suivi par un compte de ce que serait le total, d'où SQL_CALC_FOUND_ROWS après le premier SELECT. BTW: Je ne concatène pas les requêtes, chacune est dans un appel séparé à mysqli_query(). – berty

+0

Vous devriez ajouter ce détail à votre question, car cela aidera les gens à y répondre s'ils connaissent tous ces détails. – Fenton

Questions connexes