2014-09-05 101 views
0

我有一個MySQL查詢,我想幫助優化需要幫助優化

(
SELECT 
    a.`CODE`, 
    a.`TITLE`, 
    a.`TEXT`, 
    a.`CODE_RUBRIC`, 
    r.`NAME` 
FROM 
    `ARTICLE` a, 
    `RUBRIC` r 
WHERE 
    a.`CODE_TYPE` = '2' 
    AND a.`CODE_RUBRIC` = r.`CODE` 
    AND r.`VIEW` = '1' 
    AND DATE_ADD(NOW(), INTERVAL -31 DAY) < `DATE` 
    GROUP BY r.`CODE` 
    ORDER BY RAND() 
) UNION (
SELECT 
    a.`CODE`, 
    a.`TITLE`, 
    a.`TEXT`, 
    "BOOK", 
    "BOOK" 
FROM 
    `RUBRIC` r, 
    `ARTICLE` a 
WHERE 
    a.`CODE_TYPE` = '2' 
    AND a.`CODE_RUBRIC` = r.`CODE` 
    AND `JOURNAL` = '1' 
    AND DATE_ADD(NOW(), INTERVAL -31 DAY) < a.`DATE` 
    GROUP BY r.`CODE` 
    ORDER BY RAND() 
    LIMIT 1 
) 

所以,我有兩個表文章,專欄,第一選擇返回一個文章,每個專欄其中專欄的價值。 VIEW爲'1'。第二選擇返回一個結果,我通過「BOOK」手動確定最後兩列。

+0

請提供查詢也 有更好的方法蘭德獲得隨機記錄不是爲了()HTTP的解釋:// stackoverflow.com/questions/4329396/mysql-select-10-random-rows-from-600k-rows-fast – 2014-09-05 15:00:05

+0

查詢運行緩慢嗎?或者你只是在尋找一種更好的組織方式? – Travis 2014-09-05 15:00:24

+0

我想知道是否有可能分解 – user3337165 2014-09-05 15:02:34

回答

0

您可以通過使用變量來簡化查詢,一次完成所有工作。這樣做是爲了保持兩個變量與統計每個不同的值:

SELECT ar.* 
FROM (SELECT ar.*, 
      if(`view` = 1, @rnv := @rnv + 1, NULL) as rnv, 
      if(`journal` = 1, @rnj := @rnj + 1, NULL) as rnj 
     FROM (SELECT a.`CODE`, a.`TITLE`, a.`TEXT`, a.`CODE_RUBRIC`, r.`NAME` 
      FROM `ARTICLE` a JOIN 
       `RUBRIC` r 
       ON a.`CODE_RUBRIC` = r.`CODE` 
      WHERE a.`CODE_TYPE` = '2' AND 
        (r.`VIEW` = '1' OR r.JOURNAL = 1) AND 
        DATE_ADD(NOW(), INTERVAL -31 DAY) < `DATE` 
      GROUP BY r.`CODE` 
      ) ar CROSS JOIN 
      (select @rnv := 0, @rnj := 0) vars 
     ORDER BY RAND() 
    ) ar 
WHERE rnv = 1 or rnj = 1;