2011-02-09 65 views
0

我在我的网站上有一个自定义消息传递功能,并且当显示用户拥有的消息数时,我使用联合查询来这样做,因为有两种类型的消息。将MySQL查询从UNION转换为更高效的东西

我这样做如下:

SELECT COUNT(m.messageid) type_a_messagecount 
FROM messages m, 
messagerecipients r 
WHERE m.messageid = r.messageid AND 
(
m.type = 0 OR 
m.type = 2 
) AND 
r.read = 0 AND 
r.trashed = 0 AND 
r.deleted = 0 AND 
r.userid = 1 AND 
r.authorid <> 1 
UNION 
SELECT COUNT(m.messageid) type_b_messagecount 
FROM messages m, 
messagerecipients r 
WHERE m.messageid = r.messageid AND 
(
m.type = 1 
) AND 
r.read = 0 AND 
r.trashed = 0 AND 
r.deleted = 0 AND 
r.userid = 1 AND 
r.authorid <> 1 

这工作,但东西告诉我它的效率极其低下。

有没有一种方法来简化这个或我坚持使用UNION查询?

谢谢。

+0

待办事项你需要单独的值还是将它们一起添加到一起? – 2011-02-09 21:02:26

+0

这两个值需要分开。 – Tom 2011-02-09 21:03:26

回答

1
Select Sum(Case When M.type In(0,2) Then 1 Else 0 End) As type_a_messagecount 
    , Sum(Case When M.type = 1 Then 1 Else 0 End) As type_b_messagecount 
From messages As M 
    Join messagerecipients As R 
     On R.messageid = M.messageid 
Where R.read = 0 
    And R.trashed = 0 
    And R.deleted = 0 
    And R.userid = 1 
    And R.authorid <> 1 
1

什么

SELECT COUNT(m.messageid),m.type 
FROM messages m, 
    messagerecipients r 
WHERE m.messageid = r.messageid AND 
    m.type IN (0,1,2) AND 
    r.read = 0 AND 
    r.trashed = 0 AND 
    r.deleted = 0 AND 
    r.userid = 1 AND 
    r.authorid <> 1 
GROUP BY m.type 

然后以编程方式增加对0型和2

+0

这绝对有效,但它似乎平均运行速度比联合查询慢大约0.4秒。 – Tom 2011-02-09 21:10:57

+0

您可能没有正确的索引。你有m.type的索引吗?我敢肯定,如果你在消息表上有`messageid`和`type`的索引,那么这个查询会比联合更快。你能解释一下吗? – Damp 2011-02-09 21:25:34

1

子查询的结果与一个case语句会给你想要的东西:

SELECT 
    count(m.messageid), type_ 
FROM 
    (
     SELECT 
      m.messageid 
      CASE 
       WHEN m.type = 0 THEN 'a' 
       WHEN m.type = 1 THEN 'b' 
       WHEN m.type = 2 THEN 'a' 
      END as type_ 
      FROM 
       messages m,messagerecipients r 
      WHERE 
       m.messageid = r.messageid 
       AND r.read = 0 
       AND r.trashed = 0 
       AND r.deleted = 0 
       AND r.userid = 1 AND 
       AND r.authorid <> 1 
    ) as t 
GROUP BY type_