Выборка уникальных записей mysql без Group By

154
19 сентября 2019, 08:00

Всем привет! Помогите правильно составить запрос mysql, результатом которого должны быть уникальные записи таблицы books, но без использования group by. Сейчас в результате запроса записи с таблицы books повторяются. НО использовать group by не могу, т.к. в боевой базе в каждой таблице более 1 млн. записей и запрос выполняется более 40 сек, что не нормально. Индексы проставлены на все поля, по которым идет выборка. Дамп таблиц:

CREATE TABLE `authors` (
  `id` int(11) NOT NULL COMMENT 'ID',
  `name` varchar(256) DEFAULT NULL COMMENT 'Название'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `authors` (`id`, `name`) VALUES
(1, 'Автор 1'),
(2, 'Автор 2'),
(3, 'Автор 3'),
(4, 'Автор 4'),
(5, 'Автор 5');
CREATE TABLE `books` (
  `id` int(11) NOT NULL COMMENT 'ID',
  `name` varchar(256) DEFAULT NULL COMMENT 'Название'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `books` (`id`, `name`) VALUES
(1, 'Книга 1'),
(2, 'Книга 2'),
(3, 'Книга 3'),
(4, 'Книга 4');
CREATE TABLE `books_authors` (
  `book_id` int(11) DEFAULT NULL,
  `author_id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Книги у автора';
INSERT INTO `books_authors` (`book_id`, `author_id`) VALUES
(1, 1),
(1, 2),
(1, 3),
(2, 3),
(2, 4),
(3, 5);
ALTER TABLE `authors` ADD PRIMARY KEY (`id`);
ALTER TABLE `books` ADD PRIMARY KEY (`id`);
ALTER TABLE `books_authors` ADD UNIQUE KEY `book_id` (`book_id`,`author_id`), ADD KEY `author_id` (`author_id`);
ALTER TABLE `authors` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', AUTO_INCREMENT=6;
ALTER TABLE `books` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', AUTO_INCREMENT=5; COMMIT;

Сам запрос:

select 
        `books`.`id`,
        `books`.`name`,
        `authors`.`id` as `author_id`,
        `authors`.`name` as `author_name`
    from `books`
    left join `books_authors` on `books_authors`.`book_id` = `books`.`id`
    left join `authors` on `authors`.`id` = `books_authors`.`author_id`
order by `books`.`name` asc

Требуемый результат:

id  name    author_id   author_name 
1   Книга 1 1   Автор 1  
2   Книга 2 3   Автор 3 
3   Книга 3 5   Автор 5   
Answer 1

Мне кажется основная проблема в постановке задачи. Вы говорите что нужно выбрать книги, при этом выбираете все варианты книг и их авторов через LEFT JOIN. И для вашей постановки задаче это верное решение.

Постановка задачи наверное должна звучать примерно как "Нужно выбрать все книги так, чтобы они не повторялись, и к каждой еще первого автора каждой книги".

Решение не претендует на оригинальность (на скорость тем более):

SELECT
`id`,
`name`,
(SELECT `id` FROM `authors` WHERE `id` = (SELECT `author_id` FROM `books_authors` WHERE `book_id` = `books`.`id` LIMIT 1) LIMIT 1) AS `author_id`,
(SELECT `name` FROM `authors` WHERE `id` = (SELECT `author_id` FROM `books_authors` WHERE `book_id` = `books`.`id` LIMIT 1) LIMIT 1) AS `author_name`
FROM `books`

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

Нужно уточнить постановку задачи, что же в итоге нужно сделать

READ ALSO
Вёрстка HTML подписи, размер элементов

Вёрстка HTML подписи, размер элементов

Написал такой код подписи html письма:

231
width: 100% не корректно работает

width: 100% не корректно работает

Сайт https://dwimarketingru шапка имеет position: fixed; и width: 100% и в мобильной версии она растягивается в ширину больше, чем ширина экрана, хотя body и html имеют...

213
Вопрос по верстке. Как сделать такое?

Вопрос по верстке. Как сделать такое?

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

207
Как инвертировать цвет текста обводки в зависимости от фона

Как инвертировать цвет текста обводки в зависимости от фона

У меня есть два div шириной 50% каждыйСуществует огромный заголовок h1, который должен иметь цвет этих двух элементов div

227