Вход/Регистрация
Основы программирования в Linux
вернуться

Мэтью Нейл

Шрифт:

SELECT artist.name, cd.title AS "CD Title", track.track_id, track.title AS "Track" FROM artist, cd, track WHERE artist.id = cd.artist_id AND track.cd_id = cd.id AND track.track_id < 3

Если вы выполните этот оператор в MySQL Query Browser, то увидите, что данные выглядят нормально (рис. 8.11).

SQL-оператор на первый взгляд сложноват, но это можно исправить, рассматривая его последовательно по частям.

Если игнорировать части

AS
в операторе
SELECT
, его первая часть такова:

SELECT artist.name, cd.title, track.track_id, track.title

Она просто сообщает о том, какие столбцы вы хотите отобразить, используя форму записи имя_таблицы.имя_столбца.Рис. 8.11 

Части

AS
оператора SELECT

SELECT artist.name, cd.title AS "CD Title", track.track_id, and track.title AS "Track"

просто переименовывают столбцы в отображаемом выводе. Таким образом, заголовок столбца

title
из таблицы
cd
(
cd.title
) называется "CD Title", а столбец
track.track.id
— "Track". Подобное использование ключевого слова
AS
обеспечивает более дружественный по отношению к пользователю вывод. Вы практически никогда не будете применять эти имена при вызове SQL-операторов из другого языка программирования, но ключевое слово as полезно при работе с SQL-операторами из командной строки.

Следующая часть тоже понятна: она сообщает серверу имена таблиц, которые вы используете:

FROM artist, cd, track

Часть

WHERE
слегка мудреная:

WHERE artist.id = cd.artist_id AND track.cd_id = cd.id AND track.track_id < 3

Первый фрагмент сообщает серверу о том, что

id
в таблице
artist
такой же, как номер в столбце
artist_id
таблицы
cd
. Напоминаем, что вы сохраняете имя исполнителя один раз и используете
id
для ссылки на этого исполнителя в таблице
cd
. Следующий фрагмент,
track.cd_id = cd.id
, проделывает то же самое для таблиц
track
и
cd
, извещая сервер о том, что столбец
cd_id
таблицы
track
такой же, как столбец
id
таблицы
cd
. Третий фрагмент,
track.track_id < 3
, ограничивает объем возвращаемых данных так, что вы получаете только дорожки 1 и 2 из каждого компакт-диска. Последнее, но не по значимости, объединение этих трех условий с помощью операции
AND
, т.к. вы хотите, чтобы все три условия были истинными.

Доступ к данным приложения из программы на С

В этой главе вы не готовы писать законченное приложение, применяющее интерфейс GUI. Прежде надо сконцентрироваться на написании файла интерфейса, позволяющего сравнительно просто получить доступ, к вашим данным из программы на языке С. Общая проблема при написании подобного программного кода — неизвестные объем данных, которые могут быть возвращены, и способ передачи их между программой-клиентом и программой, обращающейся к базе данных. В данном приложении, для того чтобы сохранить его простоту и сосредоточиться на интерфейсе базы данных, очень важной части программного кода, будут применяться структуры фиксированного размера. В реальном приложении этот вариант может оказаться неприемлемым. Универсальное решение, также облегчающее сетевой трафик, — всегда извлекать данные построчно с помощью функций

mysql_use_result
и
mysql_fetch_row
, как было показано ранее в этой главе.

Определение интерфейса

Начните с заголовочного файла app_mysql.h, в котором определяются структуры и функции.

Сначала несколько структур:

/* Упрощенная структура для представления компакт-диска

за исключением информации о дорожке */

struct current_cd_st {

 int artist_id;

 int cd_id;

 char artist_name[100];

 char title[100];

 char catalogue[100];

};

/* Упрощенная структура сведений о дорожке */

struct current_tracks_st {

 int cd_id;

 char track[20][100];

};

#define MAX_CD_RESULT 10

struct cd_search_st {

 int cd_id[MAX_CD_RESULT];

};

Далее пара функций для подключения к серверу и отключения от него:

/* Серверные функции базы данных */

int database_start(char *name, char *password);

void database_end;

Теперь перейдем к функциям манипулирования данными. Обратите внимание на отсутствие функций создания и удаления исполнителей. Вы реализуете их за кадром, создавая необходимые записи об исполнителях и затем удаляя их, когда их упоминания не остается ни в одном альбоме.

/* Функции для добавления компакт-диска */

int add_cd(char *artist, char *title, char *catalogue, int *cd_id);

int add_tracks(struct current_tracks_st *tracks);

/* Функции поиска и извлечения компакт-диска */

int find_cds(char *search_str, struct cd_search_st *results);

int get_cd(int cd_id, struct current_cd_st *dest);

int get_cd_tracks(int cd_id, struct current_tracks_st *dest);

/* Функция для удаления элементов */

  • Читать дальше
  • 1
  • ...
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: