MYSQL: я хочу, чтобы запрос получал меньшую цену за группу книг в отношениях m-to-m - PullRequest
1 голос
/ 05 апреля 2020

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

ERD

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

Например, если он набрал политику, тогда база данных ищет все книги (из таблицы книг), в которых политика указана как Ключевое слово и получить их идентификаторы, а затем искать в таблице market_book наименьшие цены на эту книгу

Вот так

SELECT DISTINCT
    book_id
FROM
    book
WHERE
    MATCH (book_title) AGAINST ('politics' IN NATURAL LANGUAGE MODE)

Result from this query

И после этого получить эти Идентификаторы и получите наименьшую цену для каждой книги с рыночным идентификатором

Это мой запрос, но он не дал желаемого результата

SELECT 
    market, book, market_book_price
FROM
    market_book
WHERE
    book IN (SELECT DISTINCT
            book_id
        FROM
            book
        WHERE
            MATCH (book_title) AGAINST ('politics' IN NATURAL LANGUAGE MODE))
GROUP BY book

Любая помощь, пожалуйста, я хочу, чтобы запрос дал мне книга и рынок с наименьшей ценой

This query give me that

1 Ответ

0 голосов
/ 05 апреля 2020

Если я правильно понимаю, вы можете сделать что-то вроде этого:

SELECT mb.*
FROM (SELECT b.*
      FROM book b
      WHERE MATCH(book_title) AGAINST ('politics' IN NATURAL LANGUAGE MODE) > 0
     ) b JOIN
     market_book mb
     ON mb.book_id = b.book_id
WHERE mb.market_book_price = (SELECT MIN(mb2.market_book_price)
                              FROM market_book mb2
                              WHERE mb2.book_id = mb.book_id
                             );

Этот запрос структурирован, поэтому подзапрос на book может использовать полнотекстовый индекс. Затем JOIN может использовать индекс по book_id (или любым другим столбцам в таблицах).

Наконец, чтобы получить минимальную цену, можно использовать индекс по market_book(book_id, market_book_price).

В MySQL 8+ вы можете записать это как:

SELECT mb.*
FROM (SELECT b.*
      FROM book b
      WHERE MATCH(book_title) AGAINST ('politics' IN NATURAL LANGUAGE MODE) > 0
     ) b JOIN
     (SELECT mb.*,
             ROW_NUMBER() OVER (PARTITION BY book_id ORDER BY market_book_price ASC) as seqnum
      FROM market_book mb
     ) mb
     ON mb.book_id = b.book_id
WHERE seqnum = 1;

Примечание: В случае связей это возвращает произвольное самое дешевое значение. Если вы хотите все из них, используйте RANK() вместо ROW_NUMBER().

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