MYSQL:我想要一个查询,以获得m-to-m关系中的一组书籍的较低价格
怎么了,伙计们。。 现在,我有了网上书店的数据库。简单地说,我们有书,每一本书都是由一群不同价格的卖家买的 现在,当用户在数据库中搜索以获得每个结果的最低价格时,我尝试获取一个查询 例如,如果他键入politics,然后在数据库中搜索所有以politics为关键字的书籍(从book table),并获取它们的ID,然后在market_book table中搜索这些书籍的最低价格 那样MYSQL:我想要一个查询,以获得m-to-m关系中的一组书籍的较低价格,mysql,sql,subquery,Mysql,Sql,Subquery,怎么了,伙计们。。 现在,我有了网上书店的数据库。简单地说,我们有书,每一本书都是由一群不同价格的卖家买的 现在,当用户在数据库中搜索以获得每个结果的最低价格时,我尝试获取一个查询 例如,如果他键入politics,然后在数据库中搜索所有以politics为关键字的书籍(从book table),并获取它们的ID,然后在market_book table中搜索这些书籍的最低价格 那样 SELECT DISTINCT book_id FROM book WHERE MAT
SELECT DISTINCT
book_id
FROM
book
WHERE
MATCH (book_title) AGAINST ('politics' IN NATURAL LANGUAGE MODE)
在那之后,获得这些id,并为每一本有市场id的书获得最低的价格
这是我的查询,但没有得到期望的结果
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
任何帮助,请我想要一个查询给我的书和市场的最低价格
如果我理解正确,您可以这样做:
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\u id
上的索引(或表之间匹配的任何列)
最后,要获得最低价格,可以使用市场图书(图书id,市场图书价格)
上的索引
在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\u NUMBER()
如果我理解正确,您可以这样做:
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\u id
上的索引(或表之间匹配的任何列)
最后,要获得最低价格,可以使用市场图书(图书id,市场图书价格)
上的索引
在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\u NUMBER()
将mb.book\u id zo mb\u book和mb2.book\u id更改为mb2.book将mb.book\u id zo mb\u book和mb2.book\u id更改为mb2.book