Помогите плиз с запросом

Rubin

Новичок
Помогите плиз с запросом

Дано: 3 таблицы: users, job и money_out
Надо собрать из них инфу
Текущий запрос:
SELECT users.*, COUNT(job.mid) AS mcomplete, SUM(money_out.mmoney) AS mtotal_out
FROM users
LEFT JOIN (job CROSS JOIN money_out)
ON (users.mid=job.miduser AND job.mstatus=2
AND users.mid=money_out.miduser AND money_out.mstatus=1)
GROUP BY users.mid
ORDER BY users.mid

Глюк: Дает удвоенное число mcomplete и mtotal_out
 

Bitterman

Новичок
LEFT JOIN (job CROSS JOIN money_out)
ON (users.mid=job.miduser AND job.mstatus=2
AND users.mid=money_out.miduser AND money_out.mstatus=1)
Это зачем? Если нужно присоединить две таблицы, то может проще два раза сделать LEFT JOIN?
 

Rubin

Новичок
SELECT users.*, COUNT(job.mid) AS mcomplete, SUM(money_out.mmoney) AS mtotal_out
FROM users
LEFT JOIN job ON (users.mid=job.miduser AND job.mstatus=2)
LEFT JOIN money_out ON (users.mid=money_out.miduser AND money_out.mstatus=1)
GROUP BY users.mid
ORDER BY users.mid

Дает то-же самое
 

Bitterman

Новичок
Ну тогда убери GROUP BY, COUNT и SUM и посмотри, что он тебе возвращает и почему числа удваиваются. Заодно структуры таблиц кинь.
 

Rubin

Новичок
Убрал GROUP BY, COUNT и SUM
хм....
Возвращает все возможные варианты mcomplete и mtotal_out

Пример:
Администратор 11 6.00
Администратор 12 6.00
Администратор 11 0.00
Администратор 12 0.00
 

Rubin

Новичок
... да я понимаю что ни о чем не говорит.... на пальцах только не обьяснишь ... тем более здесь на форуме....

Может просто подскажешь наиболее часты ошибки следствием которых является удвоение результата

-~{}~ 31.07.07 19:19:

А вот так понятнее будет?

Табл1
id name

Табл2
id iduser money

Табл3
id iduser file

надо вывести все имена пользователей (Табл1.name)
все их деньги (Табл2.money) (отношение Табл1 к Табл2 как 1-М)
и кол-во файлов пользователя (Табл3.file) (отношение Табл1 к Табл3 как 1-М)


связь как видно через Табл1.id - Табл2.iduser и Табл1.id - Табл3.iduser
 

Wicked

Новичок
это и есть самая распространенная ошибка.

Администратор 11 6.00
Администратор 12 6.00
Администратор 11 0.00
Администратор 12 0.00
а ты ожидал увидеть для этого результат
count=2, sum=6.0 ?

Почему ты думаешь, что count-у на вход должны подаваться не 4 строки, а sum-у не числа 6.0, 6.0, 0.0, 0.0 ?
 

Rubin

Новичок
Автор оригинала: Wicked
это и есть самая распространенная ошибка.


а ты ожидал увидеть для этого результат
count=2, sum=6.0 ?

Почему ты думаешь, что count-у на вход должны подаваться не 4 строки, а sum-у не числа 6.0, 6.0, 0.0, 0.0 ?
Я просто не знаю как правильно сделать, а ожидал я действительно count=2, sum=6.0. От того запроса, который я в начале писал, я не ожидал что он будет как-то поочерёдно выполнятся, а все вместе применённые правила должны были дать правильный результат.

Примерно структуру и чего именно хочу я описал чуть выше... если можете помогите плиз запрос этот написать.
 

Bitterman

Новичок
Что-то я пока не вижу, как это можно сделать одним запросом, разве что только с подзапросами. Или делать в два приема.
 

Wicked

Новичок
Bitterman
можно и одним.

Rubin
раздели статистику по первой таблице на кол-во уникальных выбранных записей из второй, а статистику по второй - на кол-во уникальных выбранных записей из первой.

Рекомендую потренероваться на упрощенном джоине только двух таблиц: в одной 2 записи, в другой 3.
 

Rubin

Новичок
Все таки не могу понять почему нельзя одеим запросом создать три таблицы а потом их обьединить.

1-я это пользователи
2-я их деньги
3-я кол-во файлов
а потом по порядку слева приклеить
 

Bitterman

Новичок
Rubin
Все таки не могу понять почему нельзя одеим запросом создать три таблицы а потом их обьединить.
В каком смысле создать таблицы?
Посмотри еще раз внимательно как работает LEFT JOIN. Выведи себе сначала рекордсет, получаемый после одного JOIN'а и подумай, почему при втором ты получаешь неправильный результат.

Wicked
Попробовал дома на тестовых таблицах - не знаю, как можно одним запросом без подзапросов. Если бы тредстартеру были нужны в обоих случаях уникальные количества - это было бы просто. Но тут в одном случае нужно количество, а в другом - сумма. С суммой у меня загвоздка. Если можно, то хотелось бы увидеть твой вариант.
 

Gas

может по одной?
по одее одним можно если сумму разделить на количество уникальных job'ов:
[SQL](SUM(money_out.mmoney)/(IF(COUNT(DISTINCT job.miduser), COUNT(DISTINCT job.miduser), 1))) as summ[/SQL]
но возможно есть вариант лучше.
 

Wicked

Новичок
Bitterman
смотри ответ Gasа. Именно это я и имел в виду.

ЗЫ: что за дурацкая привычка у очень многих русских программистов писать summ с двумя m ? :)
 

Gas

может по одной?
что за дурацкая привычка у очень многих русских программистов писать summ с двумя m
хе-хе, просто sum выглядит как что-то системное, стрёмно :) вот и извращения.
 
Сверху