我有一个我写的MySQL查询显示我想要的数据,但运行时需要至少30秒 - 1分钟。

我研究了如何使用我需要的COUNT创建nested SELECT查询以显示我需要的数据。 The SQL也是我拥有的网页的一部分,当我在页面之间的go时,它需要相同的加载时间。我确信有一种更有效的方式来编写查询,因此它加载速度很快,因为ttb_shows表中只有大约1,500条记录,而ttb_books表中只有大约11k条记录。以下是查询。

创建TABLE ttb_books(    book_id int (11) NOT NULL,    book_name varchar (255) NOT NULL DEFAULT'',    cover_image varchar (255) DEFAULT NULL,    show_id int (11) NOT NULL DEFAULT'0',    state_id int (7) NOT NULL DEFAULT'0',    notes文字,    year varchar (255) DEFAULT NULL,    publisher varchar (255) DEFAULT NULL,    status_id int (7) NOT NULL DEFAULT'0',    no_pages varchar (255) DEFAULT NULL,    footer文字,    opt1 varchar (255) NOT NULL DEFAULT'$5-10',    opt2 varchar (255) DEFAULT NULL,    opt3 varchar (255) DEFAULT NULL,    opt4 varchar (255) DEFAULT NULL,    opt5 varchar (255) DEFAULT NULL,    owned int (1) DEFAULT'0' )ENGINE = MyISAM DEFAULT CHARSET = latin1;

创建TABLE ttb_shows(    show_id int (11) NOT NULL,    show_name varchar (255) NOT NULL DEFAULT'',    date_added datetime NOT NULL DEFAULT '0000-00-00 00:00:00' )ENGINE = MyISAM DEFAULT CHARSET = latin1;

SELECT ttb_shows.show_id, ttb_shows.show_name, ttb_shows.date_added,
    COUNT(ttb_books.book_id) AS books,
    (SELECT COUNT(ttb_books.owned) FROM ttb_books WHERE (owned=1 AND ttb_books.show_id = ttb_shows.show_id)) AS owned
FROM ttb_shows LEFT JOIN ttb_books ON ttb_shows.show_id = ttb_books.show_id 
GROUP BY ttb_shows.show_id, ttb_shows.show_name, ttb_shows.date_added

感谢所有能够提供帮助的人。非常感谢!

分析解答

您可以根据案例使用sum来避免所有者的子查询

SELECT ttb_shows.show_id
  , ttb_shows.show_name
  , ttb_shows.date_added
  , COUNT(ttb_books.book_id) AS books
  , sum( case when  ttb_books.owned = 1 then 1 else  0 end) AS owned 

FROM ttb_shows 
LEFT JOIN ttb_books ON ttb_shows.show_id = ttb_books.show_id 
GROUP BY ttb_shows.show_id, ttb_shows.show_name, ttb_shows.date_added