Ваши два вопроса здесь. Один из них - как наиболее эффективно собирать данные, другой - как обращаться с полученными вами данными.
Сначала как его собрать:
SELECT a.* FROM Author a INNER JOIN Book b ON a.id=b.author_id WHERE left(a.name,1)='a'
Нравится очень дорого, избегайте, если можете. Внутренние объединения - это ваш самый дешевый способ сравнения таблиц, особенно если у вас есть индексы для первичных ключей (id) и внешних ключей (author_id)
Если есть авторы без книг (я полагаю, что это не так много авторов), используйте левое соединение (тот же синтаксис, просто измените «внутренний» на «левый»)
Во-вторых. Если вы говорите о тысячах записей, вы можете подумать о том, чтобы собрать данные в два отдельных этапа (как я думаю, в первую очередь), если только вы не хотите, чтобы пользователь вечно ждал загрузки страницы. Например: пользователь выбирает всех авторов, которые начинаются с буквы «a», и получает список обратно - у вас может быть даже количество статей от этого автора.
SELECT a.Name count(b.author_id) titles
FROM Author a INNER JOIN Book b ON a.id=b.author_id
WHERE left(a.name,1)='a'
GROUP BY a.Name
Они увидят
John Adam: 35 Titles
Jane Acaba: 18 Titles
Jim Allan: 3 Titles
Затем пользователь нажимает на автора, загружает список книг для этого автора.
Jim Allan's Titles:
Froggy went a court'n
Death on the Nile
Life in Africa
Если вы хотите, чтобы это выглядело так, как будто все сделано одним нажатием, но вы хотите, чтобы оно появилось очень быстро, используйте xmlhttp или ajax для отображения списка авторов. Это совсем другая тема. :)
Я также должен добавить, что хранимые процедуры являются обязательными. Это значительно повысит мобильность приложения, а также производительность в большинстве баз данных.
НТН