3
votes

MySQL where clause ne fonctionne pas dans codeigniter

J'ai une requête MySQL comme celle-ci: (j'utilise CodeIgniter)

$report = $this->db->query("
          SELECT c.categoryName,
            note1.*,
            ((SELECT SUM(noteAmount)
              FROM notes
              WHERE DATE_FORMAT(noteDate, '%d-%m-%Y') = DATE_FORMAT(note1.noteDate, '%d-%m-%Y') AND noteType = 'cash_in')
            -
            (SELECT SUM(noteAmount)
             FROM notes
             WHERE DATE_FORMAT(noteDate, '%d-%m-%Y') = DATE_FORMAT(note1.noteDate, '%d-%m-%Y') AND noteType = 'cash_out')) as trxCount
           FROM notes AS note1
           JOIN
             (SELECT noteDate
              FROM notes
              GROUP BY noteDate
              HAVING COUNT(noteDate) > 0)
            AS note2
              ON note1.noteDate = note2.noteDate
            JOIN category c
              ON c.categoryID = note1.categoryID
            WHERE note1.noteType = 'cash_in'
            ORDER BY note1.noteDate DESC
            LIMIT $start, $per_page
          ")->result();

Voir la clause WHERE: WHERE note1.noteType = 'cash_in'

Je veux uniquement prendre les données de trésorerie, mais pourquoi est-ce que j'obtiens toutes les données? (y compris les retraits et autres). Ma table contient également des données de retrait

tableau des notes:

noteID | noteTitle | noteDate | noteAmount | categoryID | noteType

tableau des catégories

IDCatégorie | categoryName | parentID


3 commentaires

Quelle erreur obtenez vous? Veuillez également publier quelques exemples de données à partir des notes et du tableau des catégories ainsi que le résultat attendu.


Pas d'erreur. Mais la requête renvoie toutes les données (encaissement et encaissement). Je veux seulement recevoir de l'argent


Ajoutez des exemples de données à vos tables


3 Réponses :


0
votes

Peut-être une faute de frappe avec cash_in et in.

$report = $this->db->query("
          SELECT c.categoryName,
            note1.*,
            ((SELECT SUM(noteAmount)
              FROM notes
              WHERE DATE_FORMAT(noteDate, '%d-%m-%Y') = DATE_FORMAT(note1.noteDate, '%d-%m-%Y') AND noteType = 'in')
            -
            (SELECT SUM(noteAmount)
             FROM notes
             WHERE DATE_FORMAT(noteDate, '%d-%m-%Y') = DATE_FORMAT(note1.noteDate, '%d-%m-%Y') AND noteType = 'out')) as trxCount
           FROM notes AS note1
           JOIN
             (SELECT noteDate
              FROM notes
              GROUP BY noteDate
              HAVING COUNT(noteDate) > 0)
            AS note2
              ON note1.noteDate = note2.noteDate
            JOIN category c
              ON c.categoryID = note1.categoryID
            WHERE note1.noteType = 'in'
            ORDER BY note1.noteDate DESC
            LIMIT $start, $per_page
          ")->result();


0 commentaires

0
votes

Je pense qu'il vous manque un where dans votre instruction JOIN . Si cela se passait sur l'élément ON ou dans le SELECT lui-même, je pense que cela résoudrait votre problème.


0 commentaires

1
votes

La requête

SELECT noteDate
          FROM notes
          GROUP BY noteDate
          HAVING COUNT(noteDate) > 0

sélectionne l'intégralité des tables notes comme note2 (y compris les entrées cash_out) et le filtrage est effectué uniquement sur entrées où note1.noteType = 'cash_in' . Cela donnera à la fois les entrées cash_in et cash_out car la condition de jointure ne vérifie que note1.noteDate = note2.noteDate qui aura toujours une correspondance.

Ajoutez probablement la condition where à l'intérieur de la condition on et voyez si c'est ce que vous voulez.


0 commentaires