I have the following query:
$query4 = $db->query("SELECT count(codes.lcfruh) AS front_lcfruh, kw, datum, GROUP_CONCAT(name) AS name FROM codes
RIGHT JOIN dienstplan ON (dienstplan.schicht = codes.lcfruh OR dienstplan.schicht = codes.lcteildienst OR dienstplan.schicht = codes.lcshteil)
RIGHT JOIN personal ON personal.perso_id = dienstplan.perso_id
WHERE personal.status_sum = 'rezeption' AND dienstplan.schicht!='' AND dienstplan.kw = '$kw' AND personal.zeigen='ja'
GROUP BY dienstplan.datum");
I want to have a result of 7 input fields (for every day of the week). That works correct. Both fields with the 0 or value greate than 0 are listed, actually input field are created.
while ($result = $query4 ->fetch_object()) {
echo '<p class="taglist1"><input name="" type="text" title="'.$result->name.'" class="zbroj'.$result->front_lcfruh.'" value="'.$result->front_lcfruh.'"></p>';
}
In the title I want to have names listed if they have certain value, that is working also UNTIL I put the following line in the code in the WHERE CLAUSE
AND (dienstplan.schicht = codes.lcfruh OR dienstplan.schicht = codes.lcteildienst OR dienstplan.schicht = codes.lcshteil)
The problem is the following in this case The result is not showing the fields that are not matching, where I should have the count(codes.lcfruh)=0
. The fields that are not matching are not shown.
Is there a chance that I can put this line elsewhere in the code in order to get the null fields listed also.
The code that you are putting into the where
clause is:
AND (dienstplan.schicht = codes.lcfruh OR
dienstplan.schicht = codes.lcteildienst OR
dienstplan.schicht = codes.lcshteil
)
Although you don't intend for this to be the case, this is also adding the conditions:
dienstplan.schicht is not null and
(codes.lcfruh is not null or dienstplan.schicht is not null OR dienstplan.schicht is not null)
Because NULL
values are treated as false in the where
. This "undoes" the right outer join
.
The solution is to move the conditions to the on
clause. Alternatively, you could add additional or
clauses specifying that NULL
is an ok value.
EDIT:
Try changing the where
clause to:
AND (dienstplan.schicht = codes.lcfruh OR
dienstplan.schicht = codes.lcteildienst OR
dienstplan.schicht = codes.lcshteil OR
dienstplan.schicht is null or
(codes.lcfruh is null and codes.lcteildienst is null and codes.lcshteil is null)
)
This will keep the rows that fail the right outer join
.
EDIT II:
Next idea. Move the condition to the group_concat()
. If the first query is working, then maybe this is what you want:
GROUP_CONCAT(case when dienstplan.schicht = codes.lcfruh OR
dienstplan.schicht = codes.lcteildienst OR
dienstplan.schicht = codes.lcshteil
then ''
else name
end)
If this doesn't work, then edit your question with sample data and desired results.
EDIT III:
Is this what you want?
SELECT count(case when personal.status_sum = 'rezeption' AND dienstplan.kw = '52'
then codes.lcfruh
end) AS front_lcfruh,
kw, datum,
GROUP_CONCAT(case when personal.status_sum = 'rezeption' AND dienstplan.kw = '52'
then name
end) AS name
FROM codes
RIGHT JOIN dienstplan ON (dienstplan.schicht = codes.lcfruh)
RIGHT JOIN personal ON personal.perso_id = dienstplan.perso_id
GROUP BY dienstplan.datum;
I moved the conditions into the select
statement, so all the rows would appear.