|
Джойны
|
|||
---|---|---|---|
#18+
Есть таблица Приходы (incom), у нее подчиненная таблица Разгрузки (unload). Надо, чтобы отображались все приходы, но при этом разгрузки, соответствующие приходу, отображались только до определенной даты. Если нет разгрузок, удовлетворяющих условиям, то приход все равно должен отображаться. Если без условия по датам, то понятно, вот так: Код: sql 1. 2. 3. 4.
И будут отображаться все приходы. Но вот если по второй таблице ставим ограничение, и набор в ней оказывается пустым, то отобразится ли приход? Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 15:09 |
|
Джойны
|
|||
---|---|---|---|
#18+
Или как-то так? Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 15:16 |
|
Джойны
|
|||
---|---|---|---|
#18+
При внешнем связывании условия по внешней таблице следует располагать в секции ON: Код: sql 1. 2. 3. 4.
Ну и, чтобы NULL не получать на выходе, можно обернуть вывод суммы в COALESCE(). ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 16:23 |
|
Джойны
|
|||
---|---|---|---|
#18+
Akina При внешнем связывании условия по внешней таблице следует располагать в секции ON: Код: sql 1. 2. 3. 4.
Ну и, чтобы NULL не получать на выходе, можно обернуть вывод суммы в COALESCE(). Там на самом деле немного сложнее. Вторая таблица не одна, а джойнится с еще одной таблицей, и вот в ней уже указана дата. Так что надо как-то сделать вложенный джойн. Из этого... Код: sql 1. 2. 3. 4. 5. 6.
P.S. И правильно ли я понимаю, что LEFT JOIN... LEFT JOIN... при наличии WHERE теряет смысл и превращается в INNER JOIN ... INNER JOIN... WHERE ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 16:35 |
|
Джойны
|
|||
---|---|---|---|
#18+
svnvlad Там на самом деле немного сложнее. Вторая таблица не одна, а джойнится с еще одной таблицей, и вот в ней уже указана дата. Это ничего не меняет. svnvlad Так что надо как-то сделать вложенный джойн. Вроде сказал понятно - при внешнем связывании условия по внешней таблице следует располагать в секции ON... и даже показал как именно... не, мимо ушей. svnvlad И правильно ли я понимаю, что LEFT JOIN... LEFT JOIN... при наличии WHERE теряет смысл и превращается в INNER JOIN ... INNER JOIN... WHERE FROM a LEFT JOIN b LEFT JOIN c WHERE a.x = :x - работает как есть. FROM a LEFT JOIN b LEFT JOIN c WHERE b.x = :x - работает как FROM a INNER JOIN b LEFT JOIN c WHERE b.x = :x . FROM a LEFT JOIN b LEFT JOIN c WHERE c.x = :x - работает как FROM a INNER JOIN b INNER JOIN c WHERE c.x = :x . ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 18:40 |
|
Джойны
|
|||
---|---|---|---|
#18+
Akina svnvlad Там на самом деле немного сложнее. Вторая таблица не одна, а джойнится с еще одной таблицей, и вот в ней уже указана дата. Это ничего не меняет. svnvlad Так что надо как-то сделать вложенный джойн. Вроде сказал понятно - при внешнем связывании условия по внешней таблице следует располагать в секции ON... и даже показал как именно... не, мимо ушей. Так что ли? Код: sql 1. 2. 3. 4. 5.
Ну и что, он соединит incom с unload в любом случае (и посчитает массу), но не соединит unload c plan, если в плане неподходит дата. А нужно, чтобы он не соединял incom с unload (и соответственно не считал массу), если в плане не подходит дата. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 23:16 |
|
Джойны
|
|||
---|---|---|---|
#18+
Тогда надо так Код: sql 1. 2. 3. 4. 5.
Но куда деть LEFT JOIN plan p? Код: sql 1. 2. 3. 4. 5. 6.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 23:19 |
|
Джойны
|
|||
---|---|---|---|
#18+
Я ничего не понимаю из твоего объяснения. Предлагаю показать на примере - выложи CREATE TABLE для таблиц, INSERT INTO с примером данных, значение параметра-даты, и требуемый результат для именно этих данных. svnvlad нужно, чтобы он не соединял incom с unload (и соответственно не считал массу), если в плане не подходит дата. Часом, не вот так ли? Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 23:28 |
|
Джойны
|
|||
---|---|---|---|
#18+
Akina Я ничего не понимаю из твоего объяснения. Предлагаю показать на примере - выложи CREATE TABLE для таблиц, INSERT INTO с примером данных, значение параметра-даты, и требуемый результат для именно этих данных. svnvlad нужно, чтобы он не соединял incom с unload (и соответственно не считал массу), если в плане не подходит дата. Часом, не вот так ли? Код: sql 1. 2. 3. 4. 5. 6.
Да, что-то такое. Вот данные и пример с желаемым результатом: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.
Значение параметра a_date = '2021-10-04'. Желаемый результат: i.id = 1, SUM(u.weight) = 400 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2021, 00:26 |
|
Джойны
|
|||
---|---|---|---|
#18+
Схема БД. Смысл в том, чтобы показать, сколько было разгружено на такую-то дату. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2021, 00:28 |
|
Джойны
|
|||
---|---|---|---|
#18+
Да, последний вариант сработал Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2021, 00:46 |
|
|
start [/forum/topic.php?fid=47&msg=40103977&tid=1827919]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
150ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 277ms |
0 / 0 |