Вы должны выполнить сложение в цикле, а затем вывод после завершения цикла. Если вы собираетесь использовать +=
, вы также должны инициализировать счетчик до нуля перед циклом.
<?php
$comm_total = 0;
foreach ( Вы должны выполнить сложение в цикле, а затем вывод после завершения цикла. Если вы собираетесь использовать +=
, вы также должны инициализировать счетчик до нуля перед циклом.
[110]SESSION['merged_data'] as $data){
$comm_total += $data['sales_comm'];
?>
<tr>
<td><label><?php echo $data['sales_day']; ?></label></td>
<td><label><?php echo $data['sales_total']; ?></label></td>
<td><label><?php echo $data['sales_comm']; ?></label></td>
</tr>
<?php
} // endforeach
?>
</table>
<div class="col-sm-3"> <?php echo $comm_total; ?> </div>
Я полагаю, что можно думать об этом как о проблеме приоритета оператора.
, Когда Вы пишете это:
FROM groups grp,
insrel archiverel
LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber
LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber
я думаю, что это интерпретируется синтаксическим анализатором как это:
FROM groups grp,
(
(
insrel archiverel
LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber
)
LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber
)
Если так, затем в самом внутреннем соединении "группа" развязан.
при инвертировании строк с "группами" и "insrel" самое внутреннее соединение относится к "группам" и "ownrel", таким образом, это работает.
, Вероятно, это работало бы также:
FROM groups grp
JOIN insrel archiverel ON archiverel.dnumber = grp.number
LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber
LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber
WHERE archiverel.snumber = 11128188
Я не думаю чей-либо довольно закрепленный это или объяснил его очень хорошо. Вы комбинируете 'старый стиль' (тета) и 'новый стиль' (ANSI) соединения, которые я сильно подозреваю, группируются способами, которыми Вы не ожидаете. Посмотрите на него этот путь:
SELECT * FROM a, b JOIN c ON a.x = c.x
похож на высказывание
SELECT * FROM a, (b JOIN c on a.x = c.x)
, где вещь на кронштейнах представляет набор таблиц, объединенных в одну виртуальную таблицу, чтобы быть присоединенной на с тета-объединением против 'a'. Очевидно, таблица не может быть частью соединения, поскольку на это только присоединяются позже. Инвертируйте его, и Вы делаете
SELECT * FROM b, (a JOIN c on a.x = c.x)
, который совершенно понятен и так прекрасен. Я не уверен, почему Вы не используете синтаксис соединения ANSI для всего этого, хотя, кажется немного странным (и жестокий человеку, который должен поддержать его!)
Поскольку в первой одной группе не часть соединения НА пункте, принадлежит.
Я не знаю то, что вызывает то поведение, если это - ошибка или дизайном, но это должно хорошо работать, если Вы придерживаетесь одной формы соединения или другого.
SELECT grp.number AS number,
tags.value AS tag
FROM groups grp
JOIN insrel archiverel ON archiverel.dnumber = grp.number
LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber
LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber
WHERE archiverel.snumber = 11128188
мне было бы интересно знать больше, если поведение дизайном.
Для внутреннего объединения порядок таблиц не важен.
Для внешнего объединения, это. Весь строки от таблицы на определенной стороне (он ЛЕВОЕ ИЛИ ПРАВОЕ соединение) будут включены, в то время как только строки, которые соответствуют критериям соединения, будут включены от таблицы с другой стороны.
, поскольку ВНЕШНИЕ ОБЪЕДИНЕНИЯ сохраняют все строки от одной стороны, они, как говорят, (в целом) увеличивают наборы результатов. ВНУТРЕННИЕ ОБЪЕДИНЕНИЯ только сохраняют строки от обеих сторон, если они соответствуют, таким образом, они, как говорят, (в целом) уменьшают наборы результатов. Таким образом Вы обычно хотите сделать свои ВНУТРЕННИЕ ОБЪЕДИНЕНИЯ перед ВНЕШНИМИ ОБЪЕДИНЕНИЯМИ (когда возможный).
В Вашем случае, это - почти наверняка результат зла A, B синтаксис.