За последние 24 часа нас посетили 17577 программистов и 1615 роботов. Сейчас ищут 1756 программистов ...

Есть SQL-запрос. Как в условие впихнуть то, что в выборке?

Тема в разделе "MySQL", создана пользователем sylex, 2 май 2009.

  1. sylex

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

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    Допустим есть запрос:

    [sql]SELECT
    *,
    (SELECT COUNT(*) FROM fotos f WHERE f.object_id = p.object_id) AS photos_count
    FROM
    pages p
    WHERE
    p.blablabla <> '5151515'
    AND
    photos_count <> 0
    ORDER BY p.id DESC
    LIMIT 5[/sql]

    Как сделать такое? photos_count типа не доступно в условии. Как быть? И с JOIN'ами чет не могу придумать
     
  2. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Читай про GROUP BY
     
  3. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Просто держать общее кол-во фоток содержащееся в группе в таблице груп и обновлять тригером или апдейтом. И никаких подселектов и прочей лабуды. обсуждалось на форуме кучу раз уже.
     
  4. sylex

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

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    Psih
    Да, спасибо, понятно, можно и так. Мне больше интересует - неужели никак в условии нельзя использовать то что используешь в выборке?
     
  5. как ты можешь использовать функцию, применяемую К результатам выборки, в процессе создания этой выборки?

    AlexGousev правильно написал, тут нужно читать про GROUP BY и HAVING
     
  6. sylex

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

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    [sql]SELECT
    *,
    (SELECT COUNT(*) FROM fotos f WHERE f.object_id = p.object_id) AS photos_count
    FROM
    pages p
    WHERE
    p.blablabla <> '5151515'
    HAVING
    photos_count <> 0
    ORDER BY p.id DESC
    LIMIT 5[/sql]

    проще простого оказывается, я просто никогда не юзал HAVING :) И GROUP BY не нужен :)
     
  7. sylex

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

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    флоппик
    да над этим я уже думал, да, логично, но должно же быть что-то? И вот оно - HAVING :)
     
  8. ммм...как бы обьяснить. Это на самом деле важно для понимания SQL: GROUP BY в твоем запросе как бы есть. Точнее, использование аггрегирующих функций (типа count(), sum()) автоматически (неявно) к результатам запроса применяется группировка. На твоем примере плохо понятно, т.к. у тебя подзапрос. И вот уже HAVING работает как условие для результатов ПРИ группировке, так. же WHERE - для результатов выборки. Примерно так. )

    И пусть меня поправят товарищи которые со SQL больше на «ты» чем я, если что ))
     
  9. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Тут не группировка происходит, а подзапрос в цикле. Трудно сказать, что лучше: строить пересечение или выполнять подзапросы и как там MySQL все это внутри себя делает. Но вариант с группировкой мне почему-то кажется более правильным:
    [sql]SELECT
    pages.*, count(fotos.id) AS photos_count
    FROM
    pages AS p, fotos AS f
    WHERE
    p.blablabla <> '5151515'
    AND
    f.object_id = p.object_id
    GROUP_BY p.id
    ORDER BY p.id DESC
    LIMIT 5[/sql]

    Почему нет сравнения photos_count > 0. Мы строим пересечение (WHERE), поэтому как минимум 1 это значение равно.
     
  10. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Избыточность данных в случае достаточно большого количества данных оправдана, т.е. действительно стоит хранить кол-во фоток непосредственно в таблице pages.
     
  11. sylex

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

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    http://docs.nojabrsk.ru/informix/englis ... 3.fm1.html

    И не раз подобное встречал:
    вот что важно и что я искал:
    AlexGousev
    твой пример работает, но мне нужно не только где photo_count > 0, но и другие различные условия с photos_count. Т.е. выборку для photos_count=0 уже не сделаешь.

    Так что мой вариант по-моему самый подходящий :)
     
  12. sylex

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

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    да, это вариант самый "выгодный", но меня просто интересуют решения с составлением запросов сейчас :)
     
  13. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Также в HAVING можно условие добавить.
     
  14. sylex

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

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    не поверишь, возвращает 0 записей :)
     
  15. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    sylex
    Ну так не WHERE тогда надо, а LEFT JOIN, иначе пересечение же делается :)
     
  16. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    И условие надо будет не count(), а fotos.id is null

    [sql]SELECT
    pages.*
    FROM
    pages AS p
    LEFT JOIN fotos AS f ON f.object_id = p.object_id
    WHERE
    p.blablabla <> '5151515'
    AND
    f.id IS NULL
    GROUP_BY p.id
    ORDER BY p.id DESC
    LIMIT 5[/sql]
     
  17. sylex

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

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    AlexGousev
    так работает, но неуверсально, и работает дольше