Как одним запросом выбрать 1 строку и посчитать количество доступных?

Тема в разделе "Базы данных", создана пользователем dandandan, 5 апр 2012.

Модераторы: latteo
  1. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    267
    Есть база. например:
    id nazvanie dostupno
    1 red 0
    2 blue 1
    3 green 1
    4 yellow 1

    Надо выбрать сроку с id = 4 и посчитать количество строк с параметром dostupno=1 . Можно ли это сделать одним запросом в бд без подзапросов ?

    Сейчас делаю так:

    SELECT nazvanie, (SELECT count(id) FROM .... WHERE dostupno='1') as kolvo FROM .... WHERE id='4'
     
  2. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Код:
    select nazvanie from t where id=4 union select count(1) from t where dostupno=1
     
  3. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    267
    Тоже получается подзапрос через объединение UNION. Видимо нет такого велосипеда :(
     
  4. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Через UNION у получается 2 запроса, в которых данные ищутся по индексу (если вы правильно спроектировали структуру БД).
    Ваш запрос менее производительный потому что подзапрос
    SELECT count(id) FROM .... WHERE dostupno='1'
    будет выполняться с каждой строчкой результата запроса
    SELECT nazvanie, ... FROM .... WHERE id='4'

    Попробуйте EXPLAIN

    Кстати, подзапросы в mysql до 5й версии не работают, а UNION работает!
     
    dandandan нравится это.
  5. Funaki

    Funaki

    Регистр.:
    26 июн 2008
    Сообщения:
    151
    Симпатии:
    16
    придумал ещё вариант
    Код:
    SELECT MAX(CASE WHEN id=4 THEN nazvanie ELSE '' END) AS A1,
    SUM(CASE WHEN dostupno='1' THEN 1 ELSE 0 END) AS A2
    FROM `Table`