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 Réponses :
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();
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.
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.
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