2009-03-27 11 views
0

J'ai le code ci-dessoustotaux multiples sur sql

$sql = "SELECT 
       date1, 
       date2, 
       userid, 
       jobid, 
       result, 
       price, 
       total, 
       (SELECT distinct SUM(total1) FROM Jobs) as total2 
     FROM 
       Jobs 
      WHERE 
       total <= total1 
      GROUP BY 
       '$newphrase', '$newphrase1', '$user', '$job', result 
      ORDER BY 
       jobid DESC, userid DESC"; 
    $result = mysql_query($sql); 

il produit un grand total, mais il émet 3 fois la sortie est inférieure à

SN01 0.17 15 2.55 25.05 
SN01 0.50 15 7.5 25.05 
SN01 1 15 15 25.05 

le 25.05 est sortie 3 fois i besoin juste une fois. J'ai essayé distinct et tout ce que je peux penser S'il vous plaît aidez-moi à me rendre fou

+0

Ces résultats ne semblent pas du tout correspondre au SQL. – Bravax

+0

Ouais, montrez vos résultats un peu plus clairement .. c'est-à-dire, ColumnName et Value. – madcolor

+0

Si je comprends bien cela ... Avez-vous envisagé de créer une table temporaire, de stocker tout ce qui s'y trouve, puis d'ajouter un sous-total après son chargement, puis de le sélectionner dans la table temporaire? – madcolor

Répondre

1

Voilà comment fonctionne SQL - je vous recommande de lire à ce sujet. Votre SELECT principal renvoie trois enregistrements et pour chacun de ces enregistrements, il exécute l'instruction SELECT SUM() pour total2 - c'est la raison pour laquelle vous obtenez les trois totaux. La seule façon d'arrêter cela est de faire en sorte que le SELECT principal renvoie un enregistrement qui contient diverses techniques.

Si vous avez toujours besoin des enregistrements multiples, vous devrez ignorer les totaux mutiple et n'utiliser que le premier retourné.

0

Jeter tout sauf les totaux dans une table temporaire avec toutes les colonnes représentées (y compris le total). Vous devriez vous retrouver avec une table chargée, mais avec des valeurs nulles dans la colonne totale. Ensuite, faites une dernière requête en insérant le total dans la table temporaire. Enfin, sélectionnez dans la table temporaire.

0

SELECT DISTINCT fait référence à la ROW. Puisque vous avez différentes ROW, vous les récupérerez tous.

Si tout ce que vous voulez, c'est le total, alors pourquoi renvoyez-vous les autres colonnes? NOTE: Vous voudrez peut-être revenir en arrière et modifier votre question: il y a 8 colonnes dans le SELECT mais seulement 5 dans l'exemple de sortie (à moins que les points ne séparent la sortie de la colonne)?

Si elle est vraiment vous tuer, vous pouvez réécrire la requête pour renvoyer des lignes similaires comme celui-ci:

SELECT DISTINCT 
    date1, // Maps to column 1: SN01, 
    userid, // Maps to column 3: 15, 
    (SELECT distinct SUM(total1) 
    FROM Jobs) as total2 // Maps to Column 5: 25.05 
FROM 
    Jobs 
WHERE 
    total <= total1 
GROUP BY 
    '$newphrase', '$newphrase1', '$user', '$job', result 
ORDER BY 
    jobid DESC, 
    userid DESC 
0

Si vous avez besoin de sortie au format comme ça, vous devriez probablement utiliser un outil de reporting.

Si vous voulez un hack, utilisez l'instruction case SQL pour obtenir la valeur que pour la première ligne, comme ceci:

SELECT 
      date1, 
      date2, 
      userid, 
      jobid, 
      result, 
      price, 
      total, 
      case when rownum = 1 then 
       (SELECT distinct SUM(total1) FROM Jobs) 
      else 
       null 
      end as total2 
    FROM 
      Jobs 
     WHERE 
      total <= total1 
     GROUP BY 
      '$newphrase', '$newphrase1', '$user', '$job', result 
     ORDER BY 
      jobid DESC, userid DESC 

Attention: Ce code non testé est, selon la base de données. Êtes-vous sûr de vouloir consulter la bonne requête?

Questions connexes