2014-09-05 177 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;