За последние 24 часа нас посетили 18064 программиста и 1634 робота. Сейчас ищут 2050 программистов ...

Здравствуйте колеги, возникла проблемка с запросом сложным

Тема в разделе "MySQL", создана пользователем manfredi, 28 фев 2008.

  1. manfredi

    manfredi Активный пользователь

    С нами с:
    31 янв 2008
    Сообщения:
    16
    Симпатии:
    0
    есть следующие таблички.
    fa_forums - название и описание веток форума.
    и fa_replies темы и ответы на форуме.

    Так вот задача нуно брать все по форуму, + количество тем на форуме + количество ответов
    получился у меня вот такой вот запрос

    Код (Text):
    1. select
    2. a.*,
    3. count(b.id) as count_top
    4. count(c.id) as count_post
    5. from fa_forums a
    6. LEFT JOIN fa_replies b ON b.forum_id=a.id AND b.parent<>0
    7. LEFT JOIN fa_replies c ON c.forum_id=a.id AND c.parent=0
    8. GROUP BY a.id,a.forum_name,a.restricted,a.from_level,a.for_dep,a.sort_id,a.description
    9. ORDER BY a.sort_id
    Но почему то отдаваемый результат count_top и count_post не правильный.

    Помогите разобратся с запросом.
     
  2. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    если в таблице fa_replies вместо `parent` NOT NULL DEFAULT 0 использовать `parent` NULL, то можно было бы использовать следующий запрос:
    [sql]SELECT
    a.id,
    count(b.id) as count_replies, /* Количество сообщений в форуме */
    count(a.id) as q, /* Неправильное количство сообщений */
    count(b.parent) as count_answer, /* количество ответов */
    count(a.id) - count(b.parent) as count_theme, /* количество тем в форуме */
    FROM fa_forums as a
    LEFT JOIN fa_replies b ON b.forum_id=a.id
    GROUP BY a.id;[/sql]
     
  3. manfredi

    manfredi Активный пользователь

    С нами с:
    31 янв 2008
    Сообщения:
    16
    Симпатии:
    0
    К сожалению, то что это тема определяется тем что парент=0 а не NULL :(
     
  4. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Ну тогда совсем извращенный метод:
    [sql]SELECT a.id,
    count(CASE
    WHEN parent = 0
    THEN NULL
    WHEN parent <> 0
    THEN 1
    END) as answer,
    count(CASE
    WHEN parent <> 0
    THEN NULL
    WHEN parent = 0
    THEN 1
    END) as topic


    from fa_forums a
    LEFT JOIN fa_replies b ON b.forum_id=a.id
    GROUP BY a.id,a.forum_name,a.restricted,a.from_level,a.for_dep,a.sort_id,a.description
    ORDER BY a.sort_id;[/sql]
    Может имеет смысл два запроса?
     
  5. manfredi

    manfredi Активный пользователь

    С нами с:
    31 янв 2008
    Сообщения:
    16
    Симпатии:
    0
    Понимаешь ли .
    если делать два запроса то
    получается конструкция

    $запрос
    while(){
    $запрос

    }

    и получится тогда 25 запросов на страницу .... 24 из которыъ запрос на коунт
     
  6. manfredi

    manfredi Активный пользователь

    С нами с:
    31 янв 2008
    Сообщения:
    16
    Симпатии:
    0
    Извращенно то извращенный нол работает и быстро topas спасиб за помощь :)
     
  7. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    чем плохо:
    [sql]SELECT
    count(b.id) as count_top
    FROM fa_forums a
    LEFT JOIN fa_replies b ON b.forum_id = a.id AND b.parent<>0
    GROUP BY a.id,a.forum_name,a.restricted,a.from_level,a.for_dep,a.sort_id,a.description
    ORDER BY a.sort_id;

    SELECT
    count(b.id) as count_post
    FROM fa_forums a
    LEFT JOIN fa_replies b ON b.forum_id = a.id AND b.parent=0
    GROUP BY a.id,a.forum_name,a.restricted,a.from_level,a.for_dep,a.sort_id,a.description
    ORDER BY a.sort_id;
    [/sql]