可以用更简单的语法重写以下mysql查询吗?

时间:2014-01-04 14:02:23

标签: mysql

我是mysql的新手,我有一个相当复杂的查询,我相信可以缩短或优化。

有没有办法不每次都重复site = '{$site}'条件?

或者在按个案订购结果时不重复第一个条件?

这个查询可以用很多单词重写吗?

SELECT * FROM {$table} WHERE

(site = '{$site}' AND (id LIKE '%bwm%' OR id LIKE '%merc%'))

OR 

(site = '{$site}' AND (desc1 LIKE '%new%' OR desc2 LIKE '%smok%'))

ORDER BY CASE 

    WHEN (site = '{$site}' AND (id LIKE '%bwm%' OR id LIKE '%merc%')) THEN 1 

    ELSE 2 END 

LIMIT 50

3 个答案:

答案 0 :(得分:0)

这可能就像你得到的压缩一样:

SELECT * FROM table WHERE
site = 'site'
AND ((id LIKE '%bwm%' OR id LIKE '%merc%')
 OR (desc1 LIKE '%new%' OR desc2 LIKE '%smok%')
)
ORDER BY CASE 
    WHEN (site = '{$site}' AND (id LIKE '%bwm%' OR id LIKE '%merc%')) THEN 1 
    ELSE 2 END 
LIMIT 50

答案 1 :(得分:0)

您可以将前两个条件缩短为一个。但是,我认为你不能避免最后一次“WHEN site = ...”

SELECT * FROM {$table} WHERE

    site = '{$site}' AND ( (id LIKE '%bwm%' OR id LIKE '%merc%') 
    OR (desc1 LIKE '%new%' OR desc2 LIKE '%smok%') )

ORDER BY CASE 

    WHEN (site = '{$site}' AND (id LIKE '%bwm%' OR id LIKE '%merc%')) THEN 1 

    ELSE 2 END 

LIMIT 50

无论如何,这是一个非常简洁的陈述。

答案 2 :(得分:0)

试试这个:

SELECT * 
FROM {$table} 
WHERE
    site = '{$site}' 
    AND (
      id LIKE '%bwm%' OR id LIKE '%merc%'
      OR desc1 LIKE '%new%' OR desc2 LIKE '%smok%'
    )
ORDER BY 
   CASE WHEN (id LIKE '%bwm%' OR id LIKE '%merc%') THEN 1 
        ELSE 2 
   END 
LIMIT 50
site = '{$site}'子句中不需要

order by,因为WHERE子句会过滤掉不符合条件site = '{$site}的行 - 换句话说,所有选定的行来自此网站{$site}