Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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 获取此查询中的数据计数的更好方法?_Mysql_Sql_Select_Foreign Keys_Union - Fatal编程技术网

Mysql 获取此查询中的数据计数的更好方法?

Mysql 获取此查询中的数据计数的更好方法?,mysql,sql,select,foreign-keys,union,Mysql,Sql,Select,Foreign Keys,Union,我有一个图书库(books)和另一个表格,每当有人借书或带书回来时,它都会被记录下来(book\u loans) 基本上,我想看看在某个时间签出的所有书籍,有多少: 属于“幻想”类型 有500多页 是精装书吗 我想一次完成这一切,现在我正在使用4个查询,有更好的方法吗 PS:book\u loans。bookID是书籍的外键。id: SELECT * FROM ( SELECT COUNT(*) FROM `books` AS bks INNER JOIN `book_lo

我有一个图书库(
books
)和另一个表格,每当有人借书或带书回来时,它都会被记录下来(
book\u loans

基本上,我想看看在某个时间签出的所有书籍,有多少:

  • 属于“幻想”类型
  • 有500多页
  • 是精装书吗
我想一次完成这一切,现在我正在使用4个查询,有更好的方法吗

PS:
book\u loans
。bookID是
书籍的外键。id:

SELECT * FROM
(

    SELECT COUNT(*) FROM `books` AS bks
    INNER JOIN `book_loans` AS bs ON bks.id = bs.bookID
    WHERE bs.time = '2017-07-01 02:16:00' AND bs.signedout = 1 AND bks.genre = 'fantasy'

    UNION

    SELECT COUNT(*) FROM `books` AS bks
    INNER JOIN `book_loans` AS bs ON bks.id = bs.bookID
    WHERE bs.time = '2017-07-01 02:16:00' AND bs.signedout = 1 AND bks.pages > 500


    UNION

    SELECT COUNT(*) FROM `books` AS bks
    INNER JOIN `book_loans` AS bs ON bks.id = bs.bookID
    WHERE bs.time = '2017-07-01 02:16:00' AND bs.signedout = 1 AND bks.hardcover = 1

) x;

对于这一点,总共进行4次查询似乎效率很低。

如果您只想对所有3次查询进行合计,或者如果您需要3次不同的合计,则每个查询一次,或者您需要一些不同的内容,那么这应该可以满足您的需要

SELECT SUM(bks.genre = 'fantasy') as fantasy,
       SUM(bks.pages > 500) as pages,
       SUM(bks.hardcover = 1) as hardcover
FROM `books` AS bks
INNER JOIN `book_loans` AS bs ON bks.id = bs.bookID
WHERE bs.time = '2017-07-01 02:16:00' AND bs.signedout = 1
SELECT COUNT(*) FROM `books` AS bks
INNER JOIN `book_loans` AS bs ON bks.id = bs.bookID
WHERE bs.time = '2017-07-01 02:16:00' AND bs.signedout = 1 
AND (
    bks.genre = 'fantasy'
    OR bks.pages > 500
    OR bks.hardcover = 1
)

如果你只想知道3个总数是多少,或者如果你需要3个不同的总数,每一个都有一个,或者你需要一些不同的东西,这应该是你需要的

SELECT COUNT(*) FROM `books` AS bks
INNER JOIN `book_loans` AS bs ON bks.id = bs.bookID
WHERE bs.time = '2017-07-01 02:16:00' AND bs.signedout = 1 
AND (
    bks.genre = 'fantasy'
    OR bks.pages > 500
    OR bks.hardcover = 1
)
这是具有类似结果的juergen d的替代品;但我会和他的第一个一起去。与他的不同,在这本书中,匹配多个条件的书只会包含在第一个条件的计数中

但是,如果BooGiOffice表很大,您可能仍然考虑WHERE子句中的OR条件。

这是具有类似结果的juergen d的替代品;但我会和他的第一个一起去。与他的不同,在这本书中,匹配多个条件的书只会包含在第一个条件的计数中


但是,如果BooGiOffice表很大,您可能仍然考虑WHERE子句中的OR条件。

非常感谢!非常感谢你!