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