Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL:我想要一个查询,以获得m-to-m关系中的一组书籍的较低价格_Mysql_Sql_Subquery - Fatal编程技术网

MYSQL:我想要一个查询,以获得m-to-m关系中的一组书籍的较低价格

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

怎么了,伙计们。。 现在,我有了网上书店的数据库。简单地说,我们有书,每一本书都是由一群不同价格的卖家买的

现在,当用户在数据库中搜索以获得每个结果的最低价格时,我尝试获取一个查询

例如,如果他键入politics,然后在数据库中搜索所有以politics为关键字的书籍(从book table),并获取它们的ID,然后在market_book table中搜索这些书籍的最低价格

那样

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