Хитрые вложенные запросы

WBS

Новичок
Хитрые вложенные запросы

Имеется две таблицы
abc
def

Нужно выбрать все записи и все поля из abc и получить некоторые данные из def, связявая таблицы по id.

Написать такое:
PHP:
SELECT R1.*, R2.* FROM abc R1, (SELECT count(*) as a, min(price) as b FROM def) R2 WHERE R1.id=R2.id
нельзя, т.к. таблица def может быть пустой, а нужно обязательно выбрать все записи из непустой abc.

Можно переписать так
PHP:
SELECT R1.*, (SELECT count(*) FROM def WHERE R1.id=id) as a FROM abc R1
или так
PHP:
SELECT R1.*, (SELECT min(price) FROM def WHERE R1.id=id) as b FROM abc R1
И это работает!
Но если запросить все сразу
PHP:
SELECT R1.*, (SELECT count(*) as a, min(price) as b FROM def WHERE R1.id=id) FROM abc R1
то запрос не сработает. Как же быть?
 

WBS

Новичок
Автор оригинала: JamES
как я помню по спецификации для использования операций COUNT() MAX() MIN() AVG() SUM() нужно обязательно использовать GROUP BY
http://sql-ex.ru/help/select4.php#group_by
Нет, использовать GROUP BY не обязательно. Часто бывает, что просто нечего группировать. Собственно, первый же пример по приведенной Вами ссылке http://sql-ex.ru/help/select4.php является подтверждением этого.

-~{}~ 16.08.06 14:27:

Автор оригинала: chira
LEFT JOIN
Хочется обойтись только вложенными запросами, без JOIN'ов
 

akd

dive now, work later
Команда форума
WBS, а обьясните почему так важно обойтись без JOIN'ов?

это конечно реально но в таком случае у вас будет +N запросов, где N - количество нужных полей из второй таблицы.
 

WBS

Новичок
Автор оригинала: akd
WBS, а обьясните почему так важно обойтись без JOIN'ов?
Это не так важно. Просто я никогда их не использовал...

Автор оригинала: akd
это конечно реально но в таком случае у вас будет +N запросов, где N - количество нужных полей из второй таблицы.
А можно взглянуть на Ваше решение?
Вот такое работает
PHP:
SELECT R1.*, (SELECT count(*) FROM def WHERE R1.id=id) as a, (SELECT min(price) FROM def WHERE R1.id=id) as b FROM abc R1
хотя как-то не оптимально обращаться к одной и той же таблице с выборкой по условию два раза...
 

akd

dive now, work later
Команда форума
WBS, я описывал именно ваше решение.
по-моему, вам стоит таки прочитать в мануале про JOIN. там все довольно понятно и доступно изложено.
 

Raziel[SD]

untitled00
Автор оригинала: WBS
Это не так важно. Просто я никогда их не использовал...
Т.е. ты просто не желаешь учиться ? хочешь чтобы тебе все принесли на блюдечке ? рекомендую все-таки прислушаться к совету akd и открыть ман по JOIN'ам.
 

WBS

Новичок
Автор оригинала: Raziel[SD]
Т.е. ты просто не желаешь учиться ? хочешь чтобы тебе все принесли на блюдечке ?
Конечно же это не так :)
Был вопрос, почему я не хочу использовать JOIN...
Ответ: потому что вложенные подзапросы мне привычнее.
Только и всего.

Ман почитал еще вчера и уже опробовал различные варианты.
Лучшее, чего я добился на данный момент
PHP:
SELECT R1.*, a, b FROM (SELECT * FROM abc WHERE ...) R1
  LEFT JOIN (SELECT count(*) as a, min(price) as b, id FROM def
  WHERE ... GROUP BY id) R2 ON R1.id=R2.id
Не уверен, что решение оптимально, но оно хотя бы работает :)
Всем спасибо.
 
Сверху