2011-02-09 66 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_