[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: SUM при JOIN
rooor
Приветствую.
Объясните, пжалста...
Есть запрос:
$sql = $this->db->query("SELECT SUM(`t1`.`money`)
FROM `users` AS `u`
LEFT JOIN `test1` AS `t1` ON `t1`.`id_user` = `u`.`id`
LEFT JOIN `test2` AS `t2` ON `t2`.`id_user` = `u`.`id`
WHERE `u`.`id` = 1"
)
->
fetch_assoc();

В итоге результат SUM умножается на количество строк из таблицы test2...
Т.е. если в test1 одна строка и поле money = 10, а в таблице test2 две строки с id_user = 1, то SUM(`t1`.`money`) == 20, если в test2 добавить ещё одну строку - SUM(`t1`.`money`) будет == 30
sergeiss
Замени "SUM(`t1`.`money`)" на "`t1`.`money`". Или вообще все поля выведи. Иначе гадать можно, конечно, но зачем тратить время зря?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
rooor
sergeiss
а смысл заменять? Нужно суммировать все строки пользователя из этой таблицы
$sql = $this->db->query("SELECT `t1`.`money`
FROM `users` AS `u`
LEFT JOIN `test1` AS `t1` ON `t1`.`id_user` = `u`.`id`
LEFT JOIN `test2` AS `t2` ON `t2`.`id_user` = `u`.`id`
WHERE `u`.`id` = 1"
)
->
fetch_assoc();

результат: Array ( [money] => 10.000 )
$sql = $this->db->query("SELECT SUM(`t1`.`money`)
FROM `users` AS `u`
LEFT JOIN `test1` AS `t1` ON `t1`.`id_user` = `u`.`id`
LEFT JOIN `test2` AS `t2` ON `t2`.`id_user` = `u`.`id`
WHERE `u`.`id` = 1`"
)
->
fetch_assoc();

результат: Array ( [SUM(`t1`.`money`)] => 30.000 )
sergeiss
Цитата (rooor @ 26.02.2014 - 14:57)
а смысл заменять?

Чтобы посмотреть, что ж у тебя там за значения такие (лучше по всем полям без исключения), сколько строк и так далее smile.gif Чтобы не "гадать на кофейной гуще".

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
rooor
пжалста: :)
$this->db->query("SELECT *
FROM `users` AS `u`
LEFT JOIN `test1` AS `t1` ON `t1`.`id_user` = `u`.`id`
LEFT JOIN `test2` AS `t2` ON `t2`.`id_user` = `u`.`id`
WHERE `u`.`id` = 1"
)
->
fetch_assoc();

Array
(
[id] => 1
[user] => user
[money] => 10.000
[id_user] => 1
[id_user2] => 2
)

Таблицы
users: id | user
test1: id_user | money
test2: id_user | id_user2
rooor
он 2 строки возвращает...
Lenarfate
пользуй DISTINCT
dr.nomore
Цитата (rooor @ 26.02.2014 - 14:41)
Приветствую.
Объясните, пжалста...

Сами все объяснили. Из-за лефт джоинов инфа о юзере размножается, сумма денег растет. Вам бы в банк устроиться, с сбер лучше всего. smile.gif

Зачем нужны эти два жойна ума не приложу.

Юзайте дистинкт или группировку по основному ид юзера.
Kusss
А может кто привести пример, как DISTINCT используется совместно с LEFT JOIN ?
dr.nomore
Как обычно, и NULL будет.
dr.nomore
Ну да, с дистинктом нет смысла запрашивать больше одного поля применительно к подобным агрегаторам и подавно *. Различия будут, но по горизонтали. Distinct составит уникальные комбинации из значений колонок, при этом в колонке уникальности ждать не стоит.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.