在MySQL中合并2个以上的SELECT语句,而不是使用UNION@UNION ALL

在MySQL中合并2个以上的SELECT语句,而不是使用UNION@UNION ALL,mysql,sql,query-optimization,Mysql,Sql,Query Optimization,除了使用UNION或UNION-ALL之外,还有其他方法可以在MySQL查询中组合2个以上的SELECT语句吗?我已经尝试使用UNION和UNION-ALL,但是我的查询加载太慢了。这是我的疑问: SELECT 'AVAILABLE' AS STATUS, count(id_status) as BIL FROM book_records AS b, book_class AS c WHERE p.id_book = k.id_book AND id_status IN ( 1 ) AND c

除了使用
UNION
UNION-ALL
之外,还有其他方法可以在MySQL查询中组合2个以上的
SELECT
语句吗?我已经尝试使用
UNION
UNION-ALL
,但是我的查询加载太慢了。这是我的疑问:

SELECT 'AVAILABLE' AS STATUS, count(id_status) as BIL
FROM 
book_records AS b, book_class AS c
WHERE p.id_book = k.id_book AND id_status IN ( 1 ) AND class_desc =  'NOVEL'
UNION
SELECT 'WAITING' AS STATUS, count(id_status) as BIL
FROM 
book_records AS b, book_class AS c
WHERE p.id_book = k.id_book AND id_status IN ( 2,3,5 ) AND class_desc =  'NOVEL'
UNION
SELECT 'DAMAGED' AS STATUS, count(id_status) as BIL
FROM 
book_records AS b, book_class AS c
WHERE p.id_book = k.id_book AND id_status NOT IN ( 1,2,3,5 ) AND class_desc =  'NOVEL'

谁能告诉我如何解决这个问题

假设
p.id\u book=k.id\u book
实际上意味着
b.id\u book=c.id\u book
,您可以尝试以下替代方法:

SELECT
  STATUS,
  COUNT(*) AS BIL
FROM (
  SELECT
    CASE
      WHEN id_status IN (1)       THEN 'AVAILABLE'
      WHEN id_status IN (2, 3, 5) THEN 'WAITING'
      ELSE                             'DAMAGED'
    END AS STATUS
  FROM
    book_records AS b
  INNER JOIN
    book_class AS c
  ON
    b.id_book = c.id_book
  WHERE
    class_desc =  'NOVEL'
) AS s
GROUP BY
  STATUS
;
这可能更好,因为合并的结果集将只扫描一次

顺便说一下,从语法上讲,MySQL允许您在这种情况下避免子选择,并直接将
groupbystatus
应用于定义
STATUS
计算列的查询。但是,这不是标准语法,可能很少(如果有的话)其他SQL产品支持它。因此,最好不要这样做


此外,在可维护性和可读性方面,当查询涉及多个表时,最好始终使用列来自的表的别名来限定列,即使列名是唯一的。

您可以使用联接而不是并集!这取决于您的查询,如果您发布查询,我们可能会提供更多帮助。如果它们在性质上相似(涉及相同的表),那么您可以使用一些分组或条件重写查询。