SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.01.2012 06:38:25

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Выборка записей и подсчёт показателей (в подзапросах)

Доброе всем утро!

Такая проблема, делаю запрос который выбирает пользователей и считает количество записей с ними связанных в различных таблицах.

SELECT `member`.`id`, `member`.`name`, COUNT(`vl_arrival`.`pid`), COUNT(`vl_diary`.`unid`)
FROM `member`
LEFT JOIN `vl_arrival` ON `vl_arrival`.`vid` = `member`.`id`
LEFT JOIN `vl_diary` ON `vl_diary`.`vid` = `member`.`id`
GROUP BY `member`.`id`
ORDER BY `member`.`id` ASC


Работает нормально, если встречаются элементы COUNT только из одного запроса, а если счётчики выдают не 0 в обоих джоинах результаты их множатся друг на друга и числа становяться завышены + равны,  COUNT(`vl_arrival`.`pid`) = COUNT(`vl_diary`.`unid`), хотя такого никак не может быть. =\ А мне как на зло надо в сумме 5 таких счетчиков, типа Юзер Вася написал 1 пост, загрузил 200 фото и т.п.

EXPLAIN:
    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
1    SIMPLE    member    ALL    NULL    NULL    NULL    NULL    32    Using temporary; Using filesort
1    SIMPLE    vl_arrival    ref    vid,vid_bid    vid    4    cy2.member.id    43   
1    SIMPLE    vl_diary    ref    index    index    4    cy2.member.id    2    Using index

И файлсорт странный, хотя меня он мало беспокоит - результат запроса не верный.
Я определённо что-то не так понимаю видимо, помогите разобраться! Заранее благодарю!

Неактивен

 

#2 13.01.2012 11:00:46

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка записей и подсчёт показателей (в подзапросах)

Одним запросом не получится. Сделайте два. Ну или оформите в виде подзапросов
независимые куски. JOIN объединяет всегда все таблицы, а не попарно, как Вы хотите.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson