MySQL - присоединение, затем присоединение, затем присоединение снова - PullRequest
0 голосов
/ 14 июня 2009

Настройка MySQL: шаг за шагом.

программы -> связаны с -> ораторами (по идентификатору программы)

На данный момент мне легко запросить все данные:

SELECT * 
FROM programs 
JOIN speakers on programs.program_id = speakers.program_id

Красиво и просто.

Хитрость для меня заключается в следующем. Моя таблица спикеров также связана с третьей таблицей "Книги". Итак, в таблице «докладчики» у меня есть «book_id», а в таблице «books» book_id связан с именем.

Я пробовал это (в том числе ГДЕ вы заметите):

SELECT *
FROM programs
JOIN speakers on programs.program_id = speakers.program_id
JOIN books on speakers.book_id = books.book_id
WHERE programs.category_id = 1
LIMIT 5

Нет результатов.

Мои вопросы:

  1. Что я делаю не так?
  2. Какой самый эффективный способ сделать этот запрос?

В принципе, я хочу вернуть все данные программ и данные книг, но вместо book_id мне нужно, чтобы он возвращался как название книги (из 3-й таблицы).

Заранее спасибо за помощь.

UPDATE:
(вместо того, чтобы открывать новый вопрос)

Левое соединение сработало для меня. Однако у меня новая проблема. Несколько книг могут быть назначены одному оратору.

Используя левое соединение, возвращает две строки !! Что мне нужно добавить, чтобы вернуть только одну строку, но разделить две книги.

Ответы [ 2 ]

3 голосов
/ 14 июня 2009

есть ли вероятность, что в таблице книг нет соответствующих столбцов для динамиков. Book_id?

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

SELECT *
FROM programs
JOIN speakers on programs.program_id = speakers.program_id
LEFT JOIN books on speakers.book_id = books.book_id
WHERE programs.category_id = 1
LIMIT 5

Кстати, не могли бы вы опубликовать схемы таблиц для всех задействованных таблиц и какой именно выход (или разумное представление) вы ожидаете получить?

Редактировать : Ответ на комментарий автора

Вы можете использовать group by и group_concat, чтобы поместить все книги в один ряд.

, например

SELECT speakers.speaker_id, 
       speakers.speaker_name, 
       programs.program_id, 
       programs.program_name,
       group_concat(books.book_name)
FROM programs
JOIN speakers on programs.program_id = speakers.program_id
LEFT JOIN books on speakers.book_id = books.book_id
WHERE programs.category_id = 1
GROUP BY speakers.id
LIMIT 5

Примечание: поскольку я не знаю точных имен столбцов, они могут быть отключены

0 голосов
/ 14 июня 2009

Это обычно эффективно. Вы делаете какое-то предположение, которое не соответствует действительности. Есть ли у ваших докладчиков назначенные книги? Если они этого не делают, то последний JOIN должен быть LEFT JOIN.

Этот тип запроса обычно довольно эффективен, поскольку у вас почти наверняка есть первичные ключи в качестве индексов. Основная проблема заключается в том, покрывают ли ваши индексы (что более вероятно, если вы не используете SELECT *, а вместо этого выбираете только нужные вам столбцы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...