Внутреннее объединение и внешнее объединение; находится порядок таблиц в от важного?

Вы должны выполнить сложение в цикле, а затем вывод после завершения цикла. Если вы собираетесь использовать +=, вы также должны инициализировать счетчик до нуля перед циклом.

<?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>
16
задан Adam Bellaire 9 October 2008 в 13:03
поделиться

5 ответов

Я полагаю, что можно думать об этом как о проблеме приоритета оператора.

, Когда Вы пишете это:

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
20
ответ дан 30 November 2019 в 15:44
поделиться

Я не думаю чей-либо довольно закрепленный это или объяснил его очень хорошо. Вы комбинируете 'старый стиль' (тета) и 'новый стиль' (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 для всего этого, хотя, кажется немного странным (и жестокий человеку, который должен поддержать его!)

18
ответ дан 30 November 2019 в 15:44
поделиться

Поскольку в первой одной группе не часть соединения НА пункте, принадлежит.

5
ответ дан 30 November 2019 в 15:44
поделиться

Я не знаю то, что вызывает то поведение, если это - ошибка или дизайном, но это должно хорошо работать, если Вы придерживаетесь одной формы соединения или другого.

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

мне было бы интересно знать больше, если поведение дизайном.

4
ответ дан 30 November 2019 в 15:44
поделиться

Для внутреннего объединения порядок таблиц не важен.

Для внешнего объединения, это. Весь строки от таблицы на определенной стороне (он ЛЕВОЕ ИЛИ ПРАВОЕ соединение) будут включены, в то время как только строки, которые соответствуют критериям соединения, будут включены от таблицы с другой стороны.

, поскольку ВНЕШНИЕ ОБЪЕДИНЕНИЯ сохраняют все строки от одной стороны, они, как говорят, (в целом) увеличивают наборы результатов. ВНУТРЕННИЕ ОБЪЕДИНЕНИЯ только сохраняют строки от обеих сторон, если они соответствуют, таким образом, они, как говорят, (в целом) уменьшают наборы результатов. Таким образом Вы обычно хотите сделать свои ВНУТРЕННИЕ ОБЪЕДИНЕНИЯ перед ВНЕШНИМИ ОБЪЕДИНЕНИЯМИ (когда возможный).

В Вашем случае, это - почти наверняка результат зла A, B синтаксис.

2
ответ дан 30 November 2019 в 15:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: