I have MySQL Query like this: (I use 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();
See on WHERE Clause: WHERE note1.noteType = 'cash_in'
I only want to take the cash data, but why do I get all the data? (including cash out and others). My table also have cash out data
notes table:
noteID | noteTitle | noteDate | noteAmount | categoryID | noteType
category table
categoryID | categoryName | parentID
Possibly a typo with cash_in
and 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();
I believe you are missing a where
on your JOIN
statement. If this went on the ON element or within the SELECT itself I believe that would fix your problem.
The query
SELECT noteDate
FROM notes
GROUP BY noteDate
HAVING COUNT(noteDate) > 0
is selecting the entire notes
tables as note2
(including cash_out entries) and filtering is being done only on entries where note1.noteType = 'cash_in'
. This will give both cash_in
and cash_out
entries as the join condition only checks for note1.noteDate = note2.noteDate
which will always have some match.
Probably add where
condition inside the on
condition and see if that is what you want.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.